2

我有一个包含字典的 python 列表,我想创建一个新列表,其中包含具有唯一键和关联列表值的字典,如下所示:

Input:
 [{1: 2}, {2: 2}, {1: 3}, {2: 1}, {1: 3}]
Output:
 [{1:[2,3,3]},{2:[2,1]}]

提前致谢。

4

5 回答 5

7

怎么样:

input = [{1: 2}, {2: 2}, {1: 3}, {2: 1}, {1: 3}]

r = {}
for d in input:
    # (assumes just one key/value per dict)
    ((x, y),) = d.items() 
    r.setdefault(x, []).append(y)

print [ {k: v} for (k, v) in r.items() ]

结果:

[{1: [2, 3, 3]}, {2: [2, 1]}]

[更新]

只是好奇:你能解释一下((x, y),) = d.items()和中发生了r.setdefault(x, []).append(y)什么吗?——该死的

首先是((x, y),) = d.items()

  • 此时, d 将是来自 的元素input,例如{1: 2}
  • d.items()将类似于[(1, 2)]
  • 为了将 1 和 2 解包成 x 和 y,我们需要额外的,(否则解释器会认为外括号正在分组而不是定义单个元素元组)

r.setdefault(x, []).append(y)类似于:

if not r.has_key(x):
     r[x] = []
r[x].append(y)
于 2012-07-06T08:13:31.447 回答
3

诀窍是使用 dict.setdefault 开始一个列表并附加到它:

input = [{1: 2}, {2: 2}, {1: 3}, {2: 1}, {1: 3}]
output = {}
for d in input:
    for k,v in d.items():
        output.setdefault(k, []).append(v)

# output contains {1: [2, 3, 3], 2: [2, 1]}

output=[{k:v} for k,v in output.items()]

# output contains [{1: [2, 3, 3]}, {2: [2, 1]}]

setdefault 所做的是返回以“k”为键的现有列表,或者如果字典中不存在该键,它会使用第二个参数为该键创建一个新条目并返回该条目。无论哪种方式,它都会返回列表,无论它是预先存在的还是新的,以便您可以附加到它。

于 2012-07-06T08:14:03.647 回答
0
>>> lis=[{1: 2}, {2: 2}, {1: 3}, {2: 1}, {1: 3}]
>>> new_lis=[{}]
>>> for x in lis:
    for y in x:
       if y in new_lis[0]:
           new_lis[0][y].append(x[y])
           new_lis[0][y].sort()
       else :new_lis[0][y]=[x[y]]


>>> new_lis
[{1: [2, 3, 3], 2: [1, 2]}]
于 2012-07-06T08:17:14.540 回答
0
>>> data = [{1: 2}, {2: 2}, {1: 3}, {2: 1}, {1: 3}]
... 
... from itertools import groupby
... 
... keyFn = lambda x: x.keys()[0]
... 
... [{k: [i.values()[0] for i in g]} for k, g in groupby(sorted(data, key=keyFn), keyFn)]
0: [{1: [2, 3, 3]}, {2: [2, 1]}]
于 2012-07-06T09:02:25.250 回答
0
output = []
for b in a:
  added = 0
  i = 0
  for c in output:
    if b.keys()[0] in c.keys():
       output[i][b.keys()[0]].append(b[b.keys()[0]])
       added = 1
    i += 1

  if not added:
    output.append({b.keys()[0]: [b[b.keys()[0]]]})
于 2012-07-06T10:43:16.850 回答