如何将子列表计算的结果追加回子列表?

2024-04-27 14:04:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我想为每个子列表生成一个和,并将它直接添加回子列表。你知道吗

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

期望输出:

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

我不理想的解决方法是在列表的基础上创建一个新的列表,然后将它们压缩在一起。你知道吗

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

zip(List,Sum)

结果

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

这将在一个巨大的清单上完成,所以尽可能地提高效率


Tags: 方法lambdamap列表zip基础listsum
2条回答

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

已经在Win7上的python3.1.14x64下对10000个元素列表和10000个重复进行了测试

基于map()的soluiton,似乎是最快的。 解决方案使用itertools.starmap文件()和生成器表达式也可以在表演浪漫最后两个生产发电机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

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

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.

相关问题 更多 >