2

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

我的目标是创建一个像这样的字典——{'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.} ?

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

4

4 回答 4

6

如果我正确理解您的注意,您正在尝试合并各种字典。numpy使用内置函数的一种方法(我相信很快有人会给你一个collections答案)可能如下所示:

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')]
于 2013-09-16T19:23:31.637 回答
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]}

于 2013-09-16T19:54:06.503 回答
0

这是思考这个问题的一种方式:

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

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

假设这是您当前的字典:

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

你有这些数据要解析:

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

由于密钥'a'已经存在,因此您希望获取 的值data0['a']并附加到dby d['a'].append(data0['a'])

让我知道这会有所帮助/如果您需要任何进一步的说明!

  • 迈克巴
于 2013-09-16T19:16:26.783 回答
0

另一种方法是初始化一个字典,然后用字典中的唯一键及其对应的值填充它,而不覆盖现有值。步骤: 1. 初始化一个空字典(比如key_values)以存储所需的键值对 2. 遍历字典的原始列表 3. 一次生成一个字典 4. 如果key尚未将 a 添加到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]}
于 2017-10-30T14:29:53.473 回答