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']}
答案 0 :(得分: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']}
答案 1 :(得分: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])
答案 2 :(得分:0)
正如J.F. Sebastian所说,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]]) - >字符串列表
返回字符串S中单词的列表,使用sep作为 分隔符字符串。如果给出maxsplit,最多是maxsplit 分裂完成。 如果未指定sep或者为None,则为any 空白字符串是一个分隔符,并删除空字符串 从结果。
因此,我们不需要使用strip
删除前导和尾随空格或将空白分隔符传递给split
。 line.split()
就足够了。