我有一个数据结构。列表中包含4个字典,每个字典包含4个键和3个值。
dict_list = [0] {key1: [1, 2, 3]
key2: [4, 5, 6]
key3: [7, 8, 9]
key4: [10, 11, 12]
[1] {key1: [13.......]
key2: [16... etc.
我想将每个子列[1,4,7,10] .... [2,5,8,11]等汇总到表格中
new_dict_list = [0] {new_key: [(1+4+7+10), (2,5,8,11), (3,6,9,12)]
[1] {new_key2: [(13+16....) etc.
所以我基本上是在每个字典中级联每一列。
到目前为止,我有一个非常明确而漫长的方法(检查数学是否正确),是否有任何方法可以将列表推导用于这个啰嗦的事情或者最终不值得付出努力?
答案 0 :(得分:3)
使用zip
分组[1,4,7,10] .... [2,5,8,11]:
>>> d = dict_list[0]
>>> zip(*d.values())
[(7, 4, 1, 10), (8, 5, 2, 11), (9, 6, 3, 12)]
使用map
生成新列表:
>>> map(sum, zip(*d.values()))
[22, 26, 30]
如果您使用的是python3.x,则需要list(map...)
才能获取列表。
答案 1 :(得分:0)
您可以使用zip
和sum
功能:
dict_lis=[{next(d.iterkeys()):map(sum,zip(*d.values()))} for d in dict_lis]
dict.iterkeys()
将返回字典键的迭代器,您可以使用next
函数获取第一个键。但请注意,它不会按照您定义的顺序返回第一个键你的词典。由于字典项目没有订购,你可以使用collections.OrderedDict
来获得有序字典。
注意您不应该在词典中使用相同的键!因为您不能在最后一个组合词典中使用相同的键!
示例:
dict_lis=[{'key1': [1, 2, 3],'key2': [4, 5, 6],'key3': [7, 8, 9],'key4': [10, 11, 12]},{'key5': [13,14,15],'key6': [16,17,18]}]
print [{next(d.iterkeys()):map(sum,zip(*d.values()))} for d in dict_lis]
[{'key3': [22, 26, 30]}, {'key6': [29, 31, 33]}]
答案 2 :(得分:0)
使用列表推导的原始版本:
# set up the initial data
dict_list = []
dict_list.append({'key1': range(1,4),
'key2': range(4,7),
'key3': range(7,10),
'key4': range(10,13)})
dict_list.append({'key1': range(13,16),
'key2': range(16,19),
'key3': range(19,22),
'key4': range(22,25)})
# generate the new list
new_dict_list = []
for d in dict_list:
new_dict_list.append({'new_key': [sum(v[0] for v in d.values()),
sum(v[1] for v in d.values()),
sum(v[2] for v in d.values())] })
print new_dict_list
输出如下:
[{'new_key': [22, 26, 30]}, {'new_key': [70, 74, 78]}]