使用列表

时间:2015-12-01 17:41:26

标签: python python-2.7

我目前正在python(2.x)中编写一个小脚本,并且有一部分代码我想在不知道如何操作的情况下进行改进。

我有listlist,如下所示:

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的方式呢?也许使用reducelambda函数或什么?

6 个答案:

答案 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

中的zipislice课程
>>> 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