我有两个文件'seen.txt'和'members.txt'。第一个文件'seen.txt'列出了看过帖子的人。该文件的结构如下:
Friend/Not Friend
Name #1
Number of mutual friends
Friend/Not Friend
Name #2
Number of mutual friends
第二个文件'members.txt'列出了组中所有人的详细信息。该文件的结构如下:
Name #1
Some info about the person
Some more info about the person
Name #2
Some info about the person
Some more info about the person
现在,我想创建一个程序来显示成员但不在查看列表中的人员的姓名。为此,我创建了两个字典,用于存储每个文件的名称。完成后,我只需遍历members_list中的每个成员,看看它们是否在seen_list中。如果不是,我会在控制台中打印出该名称。
这是我写的代码:
seen = open('seen.txt').readlines()
members = open('members.txt').readlines()
i = 0
j = 0
seen_list = {}
members_list = {}
for lines in seen:
if i == 1:
seen_list[lines.strip()] = 1
i = 0
else:
i += 1
for lines in members:
if j == 0 or j == 3: # to get the first line and every third line to extract name
members_list[lines.strip()] = 1
j = 6
else:
j -= 1
for member in members_list:
if member not in seen_list:
print member
我相信我的解决方案非常精细,可以用更短更快的方式完成。任何人都可以告诉我有关这个程序的一些很酷的python黑客,以使它更有效和更短吗?
答案 0 :(得分:1)
我可能会使用集而不是字典,因为您似乎丢弃了文件中存储的大量信息而只关心名称。
我首先重新构建了从文件中导入名称的方式。我使用izip_longest
一次读取4行文件(3行文字加空行)。
from itertools import izip_longest
seen = set()
with open('seen.txt', 'r') as seen_file:
for lines in izip_longest(*[seen_file]*4):
name = lines[1].strip()
seen.add(name)
members = set()
with open('members.txt', 'r') as members_file:
for lines in izip_longest(*[members_file]*4):
name = lines[0].strip()
members.add(name)
然后我们采取设定差异。请参阅set operations here。
not_seen = members - seen
for member in not_seen: print member
答案 1 :(得分:0)
seen = open('seen.txt').readlines()
members = open('members.txt').readlines()
i = 0
j = 0
seen_list = set()
members_list = set()
for lines in seen:
seen_list.add(lines.strip())
for j, lines in enumerate(members):
if (j==0) or (j%3 == 0):
members_list.add(lines.strip())
for member in members_list:
if member not in seen_list:
print member
答案 2 :(得分:0)
members_list
是一个字典,seen_list
也是。
显然它们只携带一个值1,每个键具有相同的值。您可以使用set
来简化它。
members_list = set()
并向其添加项目:
members_list.add(lines.strip())
然后你在集合上有几个有用的功能,包括difference
:
members_not_in_seen = members_list.difference(seen_list)
也可以写
members_list - seen_list
但是你可以简化阅读部分:你可以使用切片和地图,而不是自己处理每个项目上的i
或j
计数器和调用条:
import string
members_list = set(map(string.strip, members[1::2])
seen_list = set(map(string.strip, seen[::4])