我目前正在python(2.x)中编写一个小脚本,并且有一部分代码我想在不知道如何操作的情况下进行改进。
我有list
个list
,如下所示:
my_list = [["abc",1,2,"def"],["ghi",4,5,"klm"],["nop",6,7,"qrs"]]
我需要得到索引1
处所有整数的总和以及索引2
处所有整数的总和。为此,我目前有:
sum1, sum2 = 0, 0
for i in my_list:
sum1 += i[1]
sum2 += i[2]
有什么可能是更加pythonic的方式呢?也许使用reduce
和lambda
函数或什么?
答案 0 :(得分:3)
更加pythonic的方法是使用sum
函数和for ... in ...
生成器,并在一行中完成所有工作,如下所示:
sum1, sum2 = sum(x[1] for x in my_list), sum(x[2] for x in my_list)
答案 1 :(得分:1)
最Pythonic可能是列表理解:
my_list = [["abc",1,2,"def"],["ghi",4,5,"klm"],["nop",6,7,"qrs"]]
求和:
sum1 = sum(l[1] for l in my_list)
sum2 = sum(l[2] for l in my_list)
返回:
sum1 = 11
sum2 = 14
答案 2 :(得分:0)
如果你不介意循环两次,你可以sum(x[1] for x in in my_list), sum(x[2] for x in my_list)
。
或reduce(lambda acc, l: (acc[0] + l[1], acc[1] + l[2]), my_list, (0, 0))
如果您想同时执行此操作。这将返回一个元组,第一个元素的总和为[1],第二个元素的总和为[2]
答案 3 :(得分:0)
您可以使用zip
和列表理解
>>> lst = [["abc",1,2,"def"],["ghi",4,5,"klm"],["nop",6,7,"qrs"]]
>>> [sum(i) for i in list(zip(*lst))[1:3]]
[11, 14]
或者使用itertools
zip
和islice
课程
>>> from itertools import islice
>>> [sum(i) for i in islice(zip(*lst), 1, 3)]
[11, 14]
答案 4 :(得分:0)
这是一个不使用生成器表达式的衬垫。使用zip
加解压缩转置列表,然后使用sum
在所有数字列上运行map
。
>>> map(sum, zip(*my_list)[1:-1])
[11, 14]
不幸的是,由于你无法对zip
对象进行切片,因此在3.X中有点啰嗦。
a,b = map(sum, list(zip(*my_list))[1:-1])
答案 5 :(得分:0)
您可以使用reduce
,但由于序列中的元素是列表,因此您需要设置初始值0
。在示例中:
reduce(lambda total, list: total+list[1], my_list, 0) # integers at index 1
reduce(lambda total, list: total+list[2], my_list, 0) # integers at index 2