在python中创建简单的字典

时间:2013-02-03 08:10:36

标签: python dictionary

  

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']}

3 个答案:

答案 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))

Output

{'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

setdefaultdict方法,效果相同。

    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删除前导和尾随空格或将空白分隔符传递给splitline.split()就足够了。