2017-06-05 64 views
1

我一直在试图转换这test.csv文件:Python的 - 添加元组值重复键在字典

a,b,4 
a,c,2 
b,a,4 
b,c,1 
b,d,5 
c,a,2 
c,b,1 
c,d,8 
c,e,10 
d,b,5 
d,c,8 
d,e,2 
d,z,6 
e,c,10 
e,d,2 
e,z,3 
z,d,6 
z,e,3 

进入这个格式。到目前为止,当我尝试转换它时,重复的键会被覆盖,而不会被添加为第二个值。有人能告诉我如何获得这种格式?

G1 = { 
    'a': [('b', 4), ('c', 2)], 
    'b': [('a', 4), ('c', 1), ('d', 5)], 
    'c': [('a', 2), ('b', 1), ('d', 8), ('e', 10)], 
    'd': [('b', 5), ('c', 8), ('e', 2), ('z', 6)], 
    'e': [('c', 10), ('d', 2), ('z', 3)], 
    'z': [('d', 6), ('e', 3)], 
} 

这是将文件转换为字典的代码,但替换重复键的新值。我想知道如何将值添加为元组和重复键,将元组添加为第二个值。

reader = csv.reader(open('test.csv')) 
arcos = {} 
for row in reader: 
    key = row[0] 
    arcos[key] = row[1:] 

而结果:

{ 
'a': ['c', 2.0], 
'b': ['d', 5.0], 
'c': ['e', 10.0], 
'd': ['z', 6.0], 
'e': ['z', 3.0], 
'z': ['e', 3.0] 
} 

我希望我所要求的是可能的。

+0

也许你没有使用List类型的'append''。 请显示您的代码。 – hylide

回答

1

使用defaultdictlist类,遍历文件并追加元组:

from collections import defaultdict 

G = defaultdict(list) 

with open('test.csv') as file: 
    for line in file: 
     key, letter, digit = line.strip().split(',') 
     digit = int(digit) 
     G[key].append((letter, digit)) 
0

您可以使用groupby方法,使这个简单:

from itertools import groupby 

with open('out.csv') as f: 
    print({k:[(i.split(',')[1],i.split(',')[2]) for i in g] for k, g in groupby([i.strip() for i in f],lambda x: x.split(',')[0])}) 

结果:

{'a': [('b', '4'), ('c', '2')], 'c': [('a', '2'), ('b', '1'), ('d', '8'), ('e', '10')], 'b': [('a', '4'), ('c', '1'), ('d', '5')], 'e': [('c', '10'), ('d', '2'), ('z', '3')], 'd': [('b', '5'), ('c', '8'), ('e', '2'), ('z', '6')], 'z': [('d', '6'), ('e', '3')]}