0

我有两个文件“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 hack 以使其更高效和更短?

4

3 回答 3

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)

然后我们只取设定的差异。请参阅此处的集合操作

not_seen = members - seen
for member in not_seen: print member
于 2013-08-08T16:15:47.943 回答
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
于 2013-08-08T16:15:53.040 回答
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

但是您可以简化阅读部分:您可以使用 slice 和 map 而不是自己处理 aijcounter 并在每个项目上调用 strip :

import string
members_list = set(map(string.strip, members[1::2])
seen_list = set(map(string.strip, seen[::4])
于 2013-08-08T16:25:14.533 回答