0

「seen.txt」と「members.txt」の 2 つのファイルがあります。最初のファイル「seen.txt」には、投稿を見た人がリストされています。ファイルは次のような構造になっています。

Friend/Not Friend
Name #1
Number of mutual friends

Friend/Not Friend
Name #2
Number of mutual friends

2 番目のファイル「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

今、私はメンバーであるが見られたリストにない人々の名前を表示するプログラムを作成したいと考えています. そのために、各ファイルの名前を格納する 2 つの辞書を作成します。完了したら、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 ハックについて教えてもらえますか?

4

3 に答える 3

1

ファイルに保存されている多くの情報を捨てて、名前だけを気にしているように見えるので、おそらく辞書の代わりにセットを使用します。

最初に、ファイルから名前をインポートする方法を再構築しました。一度にizip_longest4 行 (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

members_listはdictであり、そうですseen_list

どうやら、それらは 1 つの値 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])
于 2013-08-08T16:25:14.533 に答える