您可以构造一个结果dict,其中键是原始列表中前两项的元组,值是数字的list。每次向dict 添加值时,您都可以使用get 返回现有元素或给定默认值,在本例中为空列表。
拥有现有列表和要添加的列表后,您可以使用 zip_longest 和 fillvalue 从两个列表中获取要求和的数字。 zip_longest 返回长度为 2 的元组,每个列表中包含一个数字。如果一个列表比其他列表长,fillvalue 被用作默认值,因此这也适用于列表长度不同的情况。最后,列表推导可以用来对每个项目求和以获得新值:
from itertools import zip_longest
l = [
['Vienna','2012', 890,503,70],['London','2014', 5400, 879,78],
['London','2014',4800,70,90],['Bern','2013',300,450,678],
['Vienna','2013', 700,850,90], ['Bern','2013',500,700,90]
]
res = {}
for x in l:
key = tuple(x[:2])
res[key] = [i + j for i, j in zip_longest(res.get(key, []), x[2:], fillvalue=0)]
print(res)
输出:
{('Vienna', '2013'): [700, 850, 90], ('London', '2014'): [10200, 949, 168],
('Vienna', '2012'): [890, 503, 70], ('Bern', '2013'): [800, 1150, 768]}
如果您想首先按字母顺序和年份对城市进行排序,您可以将自定义 key 传递给 sorted:
for item in sorted(res.items(), key=lambda x: (x[0][0], -int(x[0][1]))):
print(item)
输出:
(('Bern', '2013'), [800, 1150, 768])
(('London', '2014'), [10200, 949, 168])
(('Vienna', '2013'), [700, 850, 90])
(('Vienna', '2012'), [890, 503, 70])