我有一个包含字典的 python 列表,我想创建一个新列表,其中包含具有唯一键和关联列表值的字典,如下所示:
Input:
[{1: 2}, {2: 2}, {1: 3}, {2: 1}, {1: 3}]
Output:
[{1:[2,3,3]},{2:[2,1]}]
提前致谢。
我有一个包含字典的 python 列表,我想创建一个新列表,其中包含具有唯一键和关联列表值的字典,如下所示:
Input:
[{1: 2}, {2: 2}, {1: 3}, {2: 1}, {1: 3}]
Output:
[{1:[2,3,3]},{2:[2,1]}]
提前致谢。
怎么样:
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()
:
input
,例如{1: 2}
d.items()
将类似于[(1, 2)]
,
(否则解释器会认为外括号正在分组而不是定义单个元素元组)r.setdefault(x, []).append(y)
类似于:
if not r.has_key(x):
r[x] = []
r[x].append(y)
诀窍是使用 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”为键的现有列表,或者如果字典中不存在该键,它会使用第二个参数为该键创建一个新条目并返回该条目。无论哪种方式,它都会返回列表,无论它是预先存在的还是新的,以便您可以附加到它。
>>> 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]}]
>>> 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]}]
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]]]})