如何在2d list python中仅使用列表理解来查找具有相同变量的值之和?

如何在2d list python中仅使用列表理解来查找具有相同变量的值之和?,python,multidimensional-array,list-comprehension,Python,Multidimensional Array,List Comprehension,假设我有一个列表: list_of_lists = [['5464', 49.96], ['5464', 99.91], ['5464', 99.91], ['7733', 208.89], ['8274', 233.82], ['8732', 93.93], ['88112', 274.89], ['88112', 199.75], ['9744', 404.55], ['9744', 404.55]] 我应该如何使用列表理解来找到每个变量的总和 E.g. sum_of_lists = [[

假设我有一个列表:

list_of_lists = [['5464', 49.96], ['5464', 99.91], ['5464', 99.91], ['7733', 208.89], ['8274', 233.82], ['8732', 93.93], ['88112', 274.89], ['88112', 199.75], ['9744', 404.55], ['9744', 404.55]]
我应该如何使用列表理解来找到每个变量的总和

E.g. sum_of_lists = [['5464', 249.78],['7733',208.89],['8274',233.82],['8732',93.93],['88112',474.64],['9744', 809.1]]

您可以使用
itertools.groupby
按第一个元素收集子列表。然后
sum
每个组中子列表的第二个元素

>>> from itertools import groupby
>>> [[k, sum(i[1] for i in g)] for k, g in groupby(list_of_lists, key=lambda i: i[0])]
[['5464', 249.78], ['7733', 208.89], ['8274', 233.82], ['8732', 93.93], ['88112', 474.64], ['9744', 809.1]]

请注意,
groupby
假定组已经排序/连续,因此如果情况并非如此,则需要先使用相同的
键对列表进行
排序
,您可以使用
itertools.groupby
按第一个元素收集子列表。然后
sum
每个组中子列表的第二个元素

>>> from itertools import groupby
>>> [[k, sum(i[1] for i in g)] for k, g in groupby(list_of_lists, key=lambda i: i[0])]
[['5464', 249.78], ['7733', 208.89], ['8274', 233.82], ['8732', 93.93], ['88112', 474.64], ['9744', 809.1]]

请注意,
groupby
假定组已排序/连续,因此如果情况并非如此,则需要先使用相同的
键对列表进行
排序
,如果输入按第一个元素排序,则可以使用:

输出

[['5464', 249.78], ['7733', 208.89], ['8274', 233.82], ['8732', 93.93], ['88112', 474.64], ['9744', 809.1]]
[('5464', 249.78), ('7733', 208.89), ('8274', 233.82), ('8732', 93.93), ('88112', 474.64), ('9744', 809.1)]
作为替代方案,对于一般输入,您可以使用以下方法:

od = OrderedDict()
for key, value in list_of_lists:
    if key in od:
        od[key] = od[key] + value
    else:
        od[key] = value

res = list(od.items())
print(res)
输出

[['5464', 249.78], ['7733', 208.89], ['8274', 233.82], ['8732', 93.93], ['88112', 474.64], ['9744', 809.1]]
[('5464', 249.78), ('7733', 208.89), ('8274', 233.82), ('8732', 93.93), ('88112', 474.64), ('9744', 809.1)]
请注意,对于Python3.6+,可以使用常规dict,而不是OrderedDict


最后,这两种方法是O(n)
,线性时间,对于较大的输入,它们的伸缩性更好。

如果输入按第一个元素排序,您可以使用:

输出

[['5464', 249.78], ['7733', 208.89], ['8274', 233.82], ['8732', 93.93], ['88112', 474.64], ['9744', 809.1]]
[('5464', 249.78), ('7733', 208.89), ('8274', 233.82), ('8732', 93.93), ('88112', 474.64), ('9744', 809.1)]
作为替代方案,对于一般输入,您可以使用以下方法:

od = OrderedDict()
for key, value in list_of_lists:
    if key in od:
        od[key] = od[key] + value
    else:
        od[key] = value

res = list(od.items())
print(res)
输出

[['5464', 249.78], ['7733', 208.89], ['8274', 233.82], ['8732', 93.93], ['88112', 474.64], ['9744', 809.1]]
[('5464', 249.78), ('7733', 208.89), ('8274', 233.82), ('8732', 93.93), ('88112', 474.64), ('9744', 809.1)]
请注意,对于Python3.6+,可以使用常规dict,而不是OrderedDict

最后,这两种方法是
O(n)
,线性时间,并且对于更大的输入将具有更好的伸缩性