如何将子列表计算的结果追溯到子列表中?

时间:2014-01-24 09:10:31

标签: python list

我想为每个子列表生成总和,然后将其追加到子列表中。

LIST = [[1,1],[2,2],[3,3],[4,4]]

期望的输出:

[[1,1,2],[2,2,4],[3,3,6],[4,4,8]]]

我的非理想解决方法是创建一个基于LIST的新列表,然后将它们压缩在一起。

Sum = map(lambda x: sum(x), LIST)

zip(List,Sum)

结果

[([1, 1], 2),([2, 2], 4),([3, 3], 6),([4, 4], 8)]

这将在一个巨大的列表上完成,所以尽量提高效率

2 个答案:

答案 0 :(得分:2)

你可以使用列表理解,就像这样

my_list = [[1,1],[2,2],[3,3],[4,4]]
print [item + [sum(item)] for item in my_list]

<强>输出

[[1, 1, 2], [2, 2, 4], [3, 3, 6], [4, 4, 8]]

如果您想修复方法,可以这样做

print map(lambda x: x + [sum(x)], my_list)

列表理解方法比map方法更快。所以更喜欢。

my_list = [[1,1],[2,2],[3,3],[4,4]]
from timeit import timeit
imports = "from __main__ import my_list"
print timeit("map(lambda x: x + [sum(x)], my_list)", imports)
print timeit("[item + [sum(item)] for item in my_list]", imports)

我机器上的输出

1.58958506584     # map method
1.11319303513     # List comprehension method.

答案 1 :(得分:0)

在您的案例中有不同的解决方案可用于生成子列表的总和并将其作为元素附加,并且它们的性能可能会有所不同。

在Win7

上的Python 3.1.14 x64下,10000个元素列表的测试已完成10000次重复 基于map()的soluiton似乎是最快的一个。 使用itertools.starmap()和生成器表达式的解决方案也可以在perfromance上获胜。最后两个生成生成器。如果是iterools.starmap(),则应该稍微更改lambda函数。 第四种解决方案是列表理解。它似乎是最慢的。 您可以使用以下代码检查平台上的性能。

import timeit
import itertools

repeat=10000
#generating 10000 element test list
big_list=[[x,y] for x,y in enumerate(range(10000))]

#setting configuration for timeit.timeit
conf_expr="from __main__ import big_list,my_f"

#giving name for lambda
my_f=lambda x:x+[sum(x)]

#tesing
print("map test")
print(timeit.timeit("map(my_f,big_list)",conf_expr,number=repeat))

print("itertool test")
#changing lambda for itertools.starmap() and giving name
my_sum=lambda x,y:[x,y]+[sum((x,y))]
#chanding configuration for timeit.timeit
conf_expr_i="from __main__ import my_sum,big_list"
print(timeit.timeit("itertools.starmap(my_sum,big_list)",conf_expr_i,number=repeat))

print("generator expr. test")
print(timeit.timeit("(i+[sum(i)] for i in big_list)",conf_expr,number=repeat))

print("list comprehensions test")
print(timeit.timeit("[i+[sum(i)] for i in big_list]",conf_expr,number=repeat))

<强>输出

map test
0.00207904110842
itertool test
0.00228213246608
generator expr. test
0.0036744175886
list comprehensions test
52.2559879524

这可能在优化问题中很有趣: http://www.python.org/doc/essays/list2str.html