可能重复:
如何使用列表推导将元组元组转换为一维列表?
假设我有以下元组列表:
[(1,2), (1,3), (1,4), (1,5), (1,6)]
Run Code Online (Sandbox Code Playgroud)
我试图将它转换为一个简单的列表,如下所示:
[1,2,1,3,1,4,1,5,1,6]
Run Code Online (Sandbox Code Playgroud)
如何将其转换为如上所示的简单列表,而不必遍历每个元素并将项目逐个添加到另一个列表?
有没有快速有效的方法来实现这一点,而不是实际迭代原始的元组列表,还是有一些内置的函数/方法来做到这一点?
Dav*_*son 29
lst = [(1,2), (1,3), (1,4), (1,5), (1,6)]
import itertools
list(itertools.chain(*lst))
# [1, 2, 1, 3, 1, 4, 1, 5, 1, 6]
Run Code Online (Sandbox Code Playgroud)
或者:
[e for l in lst for e in l]
# [1, 2, 1, 3, 1, 4, 1, 5, 1, 6]
Run Code Online (Sandbox Code Playgroud)
小智 9
" 从根本上说,哪一个更快?使用"itertools"模块,还是使用列表解析?我基本上试图提高我的计算速度." - @davidadamojr
我一直在做一些测试,我发现下面的代码实际上更快.
list_ = [(1, 2), (1, 3), (1, 4), (1, 5), (1, 6)]
list(sum(list_, ()))
Run Code Online (Sandbox Code Playgroud)
如果我错了,有人会纠正我.
以下是一些测试.
>>> list_ = [(1, 2), (1, 3), (1, 4), (1, 5), (1, 6)]
>>>
>>> operation_1 = lambda: [tuple_item for tuple_ in list_ for tuple_item in tuple_]
>>> def operation_2 ():
final_list = []
for tuple_ in list_:
for tuple_item in tuple_:
final_list.append(tuple_item)
return final_list
>>> operation_3 = lambda: reduce(list.__add__, map(list, list_))
>>> def operation_4 ():
import itertools
return list(itertools.chain(*list_))
>>> operation_5 = lambda: list(sum(list_, ()))
>>>
>>> operation_1()
[1, 2, 1, 3, 1, 4, 1, 5, 1, 6]
>>> operation_2()
[1, 2, 1, 3, 1, 4, 1, 5, 1, 6]
>>> operation_3()
[1, 2, 1, 3, 1, 4, 1, 5, 1, 6]
>>> operation_4()
[1, 2, 1, 3, 1, 4, 1, 5, 1, 6]
>>> operation_5()
[1, 2, 1, 3, 1, 4, 1, 5, 1, 6]
>>>
>>> import timeit
>>>
>>> print('operation_1 completed in %s seconds.' % (timeit.timeit(operation_1)))
operation_1 completed in 1.57890490223 seconds.
>>> print('operation_2 completed in %s seconds.' % (timeit.timeit(operation_2)))
operation_2 completed in 2.90350501659 seconds.
>>> print('operation_3 completed in %s seconds.' % (timeit.timeit(operation_3)))
operation_3 completed in 5.08437990236 seconds.
>>> print('operation_4 completed in %s seconds.' % (timeit.timeit(operation_4)))
operation_4 completed in 3.85125378138 seconds.
>>> print('operation_5 completed in %s seconds.' % (timeit.timeit(operation_5)))
operation_5 completed in 1.2623826489 seconds.
Run Code Online (Sandbox Code Playgroud)
使用chain.from_iterable,因为它通过懒洋洋地推进列表避免了不必要的一次性解包(导致冗余内存消耗):
>>> import itertools
>>> L = [(1,2), (1,3), (1,4), (1,5), (1,6)]
>>> list(itertools.chain.from_iterable(L))
[1, 2, 1, 3, 1, 4, 1, 5, 1, 6]
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12690 次 |
| 最近记录: |