0

person1 wine2

person1 wine1

person2 wine1

person2 wine2

person2 wine3

person2 wine4

person2 wine5

上記は、別のテキストファイルでの私の入力です。Pythonで次の出力辞書を作成したいと思います。

output = {'wine1':['person1'、'person2']、'wine2':['person1'、'person2']、'wine3':['person2']、'wine4':['person2'] 、'wine5':['person2']}

この出力を作成するにはどうすればよいですか?

私は何か間違ったことをしています:

def read(text): 
    wine_wishes = dict() 
    final_assignments = dict()
    with open(text) as infile:
        for line in infile: 
            line = line.split() 
            try: 
                wine_wishes[line[1]]
            except: 
                wine_wishes[line[1]] = [line[0]]

その結果、誤った出力が返されます:{'wine4':['person2']、'wine5':['person2']、'wine1':['person1']、'wine2':['person1']、 'wine3':['person2']}

4

3 に答える 3

4

あなたが使用することができますcollections.defaultdict

from collections import defaultdict

d = defaultdict(list)
for line in infile:
    if line.strip(): # skip blank lines
        person, wine = line.split()
        d[wine].append(person)

from pprint import pprint
pprint(dict(d))

出力

{'wine1': ['person1', 'person2'],
 'wine2': ['person1', 'person2'],
 'wine3': ['person2'],
 'wine4': ['person2'],
 'wine5': ['person2']}
于 2013-02-03T08:25:36.530 に答える
0

dictの各値をリストにし、各キーの最初の値の後に、すでにディクショナリにあるリストにエントリを追加する必要があります。

def read(text): 
    wine_wishes = dict() 

    with open(text) as infile:
        for line in infile: 
            line = line.split()
            if line[1] not in wine_wishes:
                wine_wishes[line[1]] = []

            wine_wishes[line[1]].append(line[0])
于 2013-02-03T08:25:24.510 に答える
0

JFセバスティアンが述べたように、collections.defaultdict達成するために使用することができます

D.get(k、d)そしてkがDにない場合はD [k]=dを設定します

しかし、同じ効果を持つのsetdefaultための方法があります。dict

    for line in infile: 
        line = line.split()
        wine_wishes.setdefault(line[1], []).append(line[0])

編集:それはこの質問とは関係ありません。私が見つけたのsplitは、ナットが完全に理解されていることです。

スプリット(...)

S.split([sep [、maxsplit]])->文字列のリスト

区切り文字列としてsepを使用して、文字列S内の単語のリストを返します。maxsplitが指定されている場合、最大でmaxsplit分割が実行されます。sepが指定されていないか、Noneの場合、空白文字列は区切り文字であり、空の文字列は結果から削除されます。

stripしたがって、先頭と末尾の空白を削除したり、空白の区切り文字をに渡したりするためにを使用する必要はありませんsplitline.split()十分です。

于 2013-02-03T08:29:17.657 に答える