0

人1酒2

人1酒1

人2酒1

人2酒2

人2酒3

人2酒4

人2酒5

以上是我在单独的文本文件中的输入。我想在 Python 中创建以下输出字典:

输出 = {'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'], '酒3':['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 Sebastian 提到的,collections.defaultdict可以用来完成

D.get(k,d) 如果 k 不在 D 中,则设置 D[k]=d

但是有一种方法setdefaultdict它具有相同的效果。

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

编辑:这与这个问题无关。我刚刚发现split是 nut 完全理解。

分裂(...)

S.split([sep [,maxsplit]]) -> 字符串列表

返回字符串 S 中的单词列表,使用 sep 作为分隔符字符串。如果给出了 maxsplit,则最多完成 maxsplit 拆分。如果 sep 未指定或为 None,则任何空白字符串都是分隔符,并从结果中删除空字符串

因此,我们不需要使用strip删除前导和尾随空格或将空格分隔符传递给split. line.split()足够的。

于 2013-02-03T08:29:17.657 回答