为什么在构建一个由哪个键保存列表的字典时,我只能看到最后一个追加?

时间:2019-04-18 14:51:00

标签: python dictionary

出于这个问题的目的,我简化了代码,但基本上,我正在解析一个oracle表并为其创建数据映射,然后在代码中稍后使用。我尝试将其保存到列表的字典中。我没有得到持有元组列表的dict(例如dict ['a'] ['b']),而是得到了一个仅引用一个元组的列表的键。最后附上。


from collections import defaultdict

somelist = ['a:b:1:2','a:b:3:4','a:b:5:6']
somehash = defaultdict(dict)

for val in somelist:
    (a,b,c,d) = val.split(":")
    somehash[a] = defaultdict(list)
    somehash[a][b].append((c,d))

for i in somehash['a']['b']:
    print i

我希望输出能够读取

('1','2')

('3','4')

('5','6')

但我只看到

('5','6')

2 个答案:

答案 0 :(得分:0)

from collections import defaultdict

somelist = ['a:b:1:2','a:b:3:4','a:b:5:6']
somehash = defaultdict(dict)

for val in somelist:
    (a,b,c,d) = val.split(":")
    if a not in somehash: # only initiate the dict for a if it has not existed yet
        somehash[a] = defaultdict(dict)
        somehash[a][b] = list()
    somehash[a][b].append((c,d))

for i in somehash['a']['b']:
    print i

答案 1 :(得分:0)

这是有效的代码(基于@galibdud的链接):

from collections import defaultdict

somelist = ['a:b:1:2','a:b:3:4','a:b:5:6','a:c:9:6','a:c:5:11']

somehash = defaultdict(lambda: defaultdict(list))

for val in somelist:
    (a,b,c,d) = val.split(":")
    somehash[a][b].append((c,d))


for i,k in somehash.iteritems():
    print i, ' goes with ', k
    for a,b in k.iteritems():
        print a, ' goes with ', b
        for t in b:
            print t

现在输出显示为

a goes with defaultdict(<type 'list'>, {'c': [('9', '6'), ('5', '11')], 'b': [('1', '2'), ('3', '4'), ('5', '6')]})
c goes with [('9', '6'), ('5', '11')]
('9', '6')
('5', '11')
b goes with [('1', '2'), ('3', '4'), ('5', '6')]
('1', '2')
('3', '4')
('5', '6')