如何在python中对N个列表的元素求和?



我有一个列表的元组列表…:

lst = [(['a', 1], ['b', 2]), (['c', 3], ['d', 4], ['e', 5])]

我想要得到每个元组(第一个元组= 3,第二个元组= 12)中每个列表的index[1]的和结果如下所示:

['ab', 3]
['cde', 12]

我试过了:

for tuples in lst:
total = [x + y for (x, y) in zip(*tuples)]
print(total)

,但如果一个元组有两个以上的值(如第二个),我将得到一个值错误。

我需要得到所有列表的和,无论每个元组中列表的个数是多少

所以我试着这样做:

for tuples in lst:
sum = [sum(x) for x in zip(*tuples)]

但是我得到一个TypeError: 'list' object is not callable

有什么想法吗?

看看这个

result = [("".join(list(zip(*tup))[0]), sum(list(zip(*tup))[1])) for tup in lst]

简写为:

L = [(['a', 1], ['b', 2]), (['c', 3], ['d', 4], ['e', 5])]
for t in L:
s = ''.join(x[0] for x in t)
S = sum(x[1] for x in t)
print([s, S])

和避免使用python关键字定义变量名…

这是一个想法,使用zip的嵌套列表推导和自定义函数来求和或连接:

lst = [(['a', 1], ['b', 2]), (['c', 3], ['d', 4], ['e', 5])]
def sum_or_join(l):
try:
return sum(l)
except TypeError:
return ''.join(l)

out = [[sum_or_join(x) for x in zip(*t)] for t in lst]

或者如果在内部元组中总是有两个元素,并且总是('string', int):

out = [[f(x) for f, x in zip((''.join, sum), zip(*t))]
for t in lst]

输出:[['ab', 3], ['cde', 12]]

下面的一行代码在结果

中生成所需的[('ab', 3), ('cde', 12)]
lst = [(['a', 1], ['b', 2]), (['c', 3], ['d', 4], ['e', 5])] # don't use list 
# as variable name
# One-liner using builtin functions sum, list and Walrus operator
result = [(''.join(p[0]), sum(p[1])) for sublist in lst if (p:=list(zip(*sublist)))]

注意后不应该用作变量名冲突以来流行的内装式功能:

应该清晰明了。

A = [(['a', 1], ['b', 2]), (['c', 3], ['d', 4], ['e', 5])]
result = []
for tup in A:
char, value = "", 0
for x, y in tup:
char += x
value += y
result.append([char, value])
print(result)

使用zip:

result = []
for tup in A:
tmp = []
for x in zip(*tup):
if type(x[0]) == str:
tmp.append(''.join(x))
elif type(x[0]) == int:
tmp.append(sum(x))
result.append(tmp)
print(result)

样本O/p:

[['ab', 3], ['cde', 12]]

试试这个:

result = [[''.join([x for x,y in item]),sum([y for x,y in item])] for item in lst]

我希望这有助于

lst = [ (['a', 1], 
['b', 2]), 

(['c', 3], 
['d', 4], 
['e', 5]) ]
for i in lst:
print["".join([d for d in zip(*i)][0]), sum([d for d in zip(*i)][1])]

第一个代码的问题是;你有x+y,它只适用于循环的第一次迭代,因为只有2个值需要解包。但这不会为第二次迭代工作。

第二个代码的问题是,你试图将类型int和类型str一起添加

  • 为了避免混淆,我将变量list重命名为lst

最新更新