字典Python中重复键的值列表

时间:2013-09-16 19:05:52

标签: python dictionary key duplicates defaultdict

如果这个问题已在这里探讨过,请提前道歉 - 我在这里查看了不同的答案,但找不到我需要的答案。

我的目标是创建一个这样的词典 - {'a':[10, 9, 10, 10], 'b':[10, 9, 1, 0], 'c':[0, 5, 0, 1], and so on}

我所拥有的是具有重复键的多个词典(每个其他词典中都有相同的键),类似这样 {'a':10, 'b': 0, 'c': 2} {'a':7, 'b': 4, 'c': 4} {'a':4, 'b': 5, 'c': 3}

我无法知道这些字典的数量,或者是否有密钥继续到'f',或者其中有'g',但我知道密钥是重复的。我试过defaultdict,但我得到的是 -

defaultdict(<type 'list'>, {'a': [10]})
defaultdict(<type 'list'>, {'a': [10], 'b': [3]})
defaultdict(<type 'list'>, {'a': [10], 'b': [3], 'c': [0]})

然后下一个字典的相同内容 -

defaultdict(<type 'list'>, {'a': [4]})
defaultdict(<type 'list'>, {'a': [4], 'b': [5]})
defaultdict(<type 'list'>, {'a': [4], 'b': [5], 'c': [1]})

上面输出的代码是 -

d = collections.defaultdict(list)
    for k, v in z.iteritems():
        d[k].append(v)
        c = d.items()
        print d

如果我改为print c(打印d.items()),我会 -

[('a', [10])]
[('a', [10]), ('b', [3])]
[('a', [10]), ('c', [0]), ('b', [3])]

对于每个字典再次重复。如何获得1个dict,包含所有键,值 -

{'a':[10,0,..], 'b':[4, 3, 4,..], etc.} ?

我还应该补充一点,我所拥有的词汇是for循环的结果,而不是单独存储在一个唯一变量中。

4 个答案:

答案 0 :(得分:6)

如果我理解你的注意事项,你正试图合并各种词典。使用内置插件的一种方式(我相信很快会有人给你一个numpycollections答案)可能看起来像这样:

ds = [
    {'a':10, 'b': 0, 'c': 2},
    {'a':7, 'b': 4, 'c': 4},
    {'a':4, 'b': 5, 'c': 3} ]

merged = {}
for d in ds:
    for k, v in d.items ():
        if k not in merged: merged [k] = []
        merged [k].append (v)

print (merged)

(为了清晰起见,相当冗长)

修改 在阅读了您的评论,说明“我想要的结果是一个值/键列表。”之后,您可以在生成的合并字典上使用它:

print ( [ (v, k) for k, v in merged.items () ] )

这会产生:

[([10, 7, 4], 'a'), ([2, 4, 3], 'c'), ([0, 4, 5], 'b')]

答案 1 :(得分:2)

这是你需要的吗?

in_dicts = [{'a':10, 'b': 0, 'c': 2}, {'a':7, 'b': 4, 'c': 4}, {'a':4, 'b': 5, 'c': 3}]
out_dict = {}

for in_d in in_dicts:
  for k, v in in_d.iteritems():
    out_dict.setdefault(k, []).append(v)  
print out_dict

{'a':[10,7,4],'c':[2,4,3],'b':[0,4,5]}

答案 2 :(得分:0)

以下是思考这个问题的一种方法:

给定Python中的字典,您可以value访问dictionary[key]。 在您的情况下,字典的值是列表。

因此,你可以提出一个函数来获取一个键,看看它是否已经存在于你的字典中,如果它已经存在,只需将值附加到字典中。例如:

说这是你当前的字典:

d = { 'a':[3, 17], 'b':[2, 4] }

并且您要解析此数据:

data0 = { 'a':10, 'b':2, 'c':2 }

由于密钥'a'已存在,您希望获取data0['a']的值并d追加d['a'].append(data0['a'])

如果您需要进一步澄清,请告诉我这有帮助!

  • mikeba

答案 3 :(得分:0)

另一种方法是初始化一个字典,然后用字典中的唯一键和相应的值填充它,而不覆盖现有值。 脚步: 1.初始化一个空字典(比如key_values)以存储所需的键 - 值对 2.迭代原始的dicts列表 3.收益率一次一个 4。 如果尚未将key添加到key_values字典,请添加key并将其value添加到列表中;否则,将value附加到现有密钥(列表)的值。

list_of_dicts = [{'a':10, 'b': 0, 'c': 2}, {'a':7, 'b': 4, 'c': 4}, {'a':4, 'b': 5, 'c': 3}]
key_values = {}

for d in list_of_dicts:
    for k,v in d.iteritems():
        if k in key_values.keys():
            key_values[k].append(v)
        else:    
            key_values[k]=[v]

print key_values #prints out: {'a': [10, 7, 4], 'c': [2, 4, 3], 'b': [0, 4, 5]}