我如何添加 Python 列表中不同列表的元组数量?
How can i add the numbers of tuples from different lists of a a list in Python?
这是我所拥有的(在 python 版本 3.7.4 中):
P= [[('Lista-A', 1), ('Lista-X', 1), ('Lista-Z', 4)], [('Lista-A', 2), ('Lista-X', 0), ('Lista-Z', 1)], [('Lista-A', 5), ('Lista-X', 1), ('Lista-Z', 0)], [('Lista-A', 0), ('Lista-X', 1), ('Lista-Z', 4)]]
我正在尝试对与 "Lista-A"、"Lista-X" 和 "Lista-Z" 相关的所有数字求和,这样我就可以得到这样的结果(只是一个元组列表,其中包含每个 "Lista"):
关联的数字总和
[('Lista-A', 8), ('Lista-X', 3), ('Lista-Z', 9)]
我试过使用 for 循环,但我没有成功。
for lista in P:
for i in lista:
我不知道如何继续代码...任何人都可以帮助我吗?
提前致谢!
如果 "list names" 总是以相同的顺序排列,您可以使用 zip
和 sum
:
的列表理解来做到这一点
>>> data = [[('Lista-A', 1), ('Lista-X', 1), ('Lista-Z', 4)], [('Lista-A', 2), ('Lista-X', 0), ('Lista-Z', 1)], [('Lista-A', 5), ('Lista-X', 1), ('Lista-Z', 0)], [('Lista-A', 0), ('Lista-X', 1), ('Lista-Z', 4)]]
>>> [(col[0][0], sum(x for _, x in col)) for col in zip(*data)]
[('Lista-A', 8), ('Lista-X', 3), ('Lista-Z', 9)]
zip(*data)
是从 "rows" 列表迭代 "columns" 的标准方法。假设这些列确实排成一行,那么每列都包含要为相同 "list name" 求和的所有数字。 sum
函数将数字相加;这些列包含我们想要对第二个组件中的数字求和的元组,因此解构赋值 _, x
.
这应该有效
from collections import defaultdict
input = [[('Lista-A', 1), ('Lista-X', 1), ('Lista-Z', 4)], [('Lista-A', 2), ('Lista-X', 0), ('Lista-Z', 1)], [('Lista-A', 5), ('Lista-X', 1), ('Lista-Z', 0)], [('Lista-A', 0), ('Lista-X', 1), ('Lista-Z', 4)]]
d = defaultdict(int)
for i in input:
for j in i:
d[j[0]] += j[1]
res = list(d.items())
不是最优雅的"pythonic"方式,而是使用您的代码
new_lista = {}
for lista in p:
for i in lista:
new_lista[i[0]] = new_lista.get(i[0], 0) + i[1]
p1 = [(k,v) for k,v in new_lista.items()]
导入后的单行代码很糟糕,但确实有效!
>>> from functools import reduce
>>> reduce(lambda x, y: dict((k, v + y[k]) for k, v in x.items()), [dict(i) for i in input])
{'Lista-A': 8, 'Lista-X': 3, 'Lista-Z': 9}
这是我所拥有的(在 python 版本 3.7.4 中):
P= [[('Lista-A', 1), ('Lista-X', 1), ('Lista-Z', 4)], [('Lista-A', 2), ('Lista-X', 0), ('Lista-Z', 1)], [('Lista-A', 5), ('Lista-X', 1), ('Lista-Z', 0)], [('Lista-A', 0), ('Lista-X', 1), ('Lista-Z', 4)]]
我正在尝试对与 "Lista-A"、"Lista-X" 和 "Lista-Z" 相关的所有数字求和,这样我就可以得到这样的结果(只是一个元组列表,其中包含每个 "Lista"):
关联的数字总和[('Lista-A', 8), ('Lista-X', 3), ('Lista-Z', 9)]
我试过使用 for 循环,但我没有成功。
for lista in P:
for i in lista:
我不知道如何继续代码...任何人都可以帮助我吗? 提前致谢!
如果 "list names" 总是以相同的顺序排列,您可以使用 zip
和 sum
:
>>> data = [[('Lista-A', 1), ('Lista-X', 1), ('Lista-Z', 4)], [('Lista-A', 2), ('Lista-X', 0), ('Lista-Z', 1)], [('Lista-A', 5), ('Lista-X', 1), ('Lista-Z', 0)], [('Lista-A', 0), ('Lista-X', 1), ('Lista-Z', 4)]]
>>> [(col[0][0], sum(x for _, x in col)) for col in zip(*data)]
[('Lista-A', 8), ('Lista-X', 3), ('Lista-Z', 9)]
zip(*data)
是从 "rows" 列表迭代 "columns" 的标准方法。假设这些列确实排成一行,那么每列都包含要为相同 "list name" 求和的所有数字。 sum
函数将数字相加;这些列包含我们想要对第二个组件中的数字求和的元组,因此解构赋值 _, x
.
这应该有效
from collections import defaultdict
input = [[('Lista-A', 1), ('Lista-X', 1), ('Lista-Z', 4)], [('Lista-A', 2), ('Lista-X', 0), ('Lista-Z', 1)], [('Lista-A', 5), ('Lista-X', 1), ('Lista-Z', 0)], [('Lista-A', 0), ('Lista-X', 1), ('Lista-Z', 4)]]
d = defaultdict(int)
for i in input:
for j in i:
d[j[0]] += j[1]
res = list(d.items())
不是最优雅的"pythonic"方式,而是使用您的代码
new_lista = {}
for lista in p:
for i in lista:
new_lista[i[0]] = new_lista.get(i[0], 0) + i[1]
p1 = [(k,v) for k,v in new_lista.items()]
导入后的单行代码很糟糕,但确实有效!
>>> from functools import reduce
>>> reduce(lambda x, y: dict((k, v + y[k]) for k, v in x.items()), [dict(i) for i in input])
{'Lista-A': 8, 'Lista-X': 3, 'Lista-Z': 9}