每个项目存储可变数量的值

时间:2015-04-28 13:59:39

标签: python dictionary

我想阅读并存储在defaultdict(list)个csv文件中:

Pos   ID    Name
1   0001L01 50293
2   0002L01 128864
3   0003L01 172937
4   0004L01 12878
5   0005L01 demo
6   0004L01 12878
7   0004L01 12878
8   0005L01 demo

我希望ID成为我的密钥,并将其作为值Pos和名称。但Pos的数量会有所不同。例如,ID 0005L01包含Pos 8和5,而0001L01包含Pos 1.有没有办法做到这一点? 到目前为止,我得到了:

reader = csv.reader(open("sheet.csv", "rb"))
for row in reader:
       if any(row):
          dlist.append(row)

for k, g in groupby(zip(mylist, itertools.count()), key=lambda x: x[0][1]):
            map(lambda x: d[k].append((x[0][0], x[1], x[0][2])), g)

1 个答案:

答案 0 :(得分:2)

您可以使用dict.setdefault方法创建预期字典:

import csv
d={}
with open('my_file.csv', 'rb') as csvfile:
     spamreader = csv.reader(csvfile, delimiter=' ')
     for row in spamreader:
     try :
         Pos,ID,Name=row
         d.setdefault(ID,[]).append([Pos,Name])
     except ValueError :
          continue

结果:

{'0001L01': [['1', '50293']],
 '0003L01': [['3', '172937']], 
 '0002L01': [['2', '128864']], 
 '0005L01': [['5', 'demo'], ['8', 'demo']], 
 '0004L01': [['4', '12878'], ['6', '12878'], ['7', '12878']]}

正如@tobias_k所说,如果您的文件中没有pos列,则可以使用enumerate手动创建:

import csv
d={}
with open('my_file.csv', 'rb') as csvfile:
     spamreader = csv.reader(csvfile, delimiter=' ')
     for Pos,row in enumerate(spamreader,1):
     try :
         ID,Name=row
         d.setdefault(ID,[]).append([Pos,Name])
     except ValueError :
          continue