>>> result_list = []
>>> for x in ['1', '22', '333']:
... for y in list(x):
... result_list.append(y)
...
>>> print(result_list)
['1', '2', '2', '3', '3', '3']
$python3 -m timeit "import collections
def it(obj):
if isinstance(obj, collections.Iterable):
for ob in obj:
if isinstance(ob, collections.Iterable) and len(ob) > 1:
yield from it(ob)
else: yield ob
else:
yield obj
list(it(['1', 2, [2, 44, '123', ('qwe')], 2]))"
100000 loops, best of 3: 14.6 usec per loop
import time
from functools import wraps, reduce
def tefn(fn, args, kwargs):
t = time.time()
tuple(fn(*args, **kwargs))
return t - time.time()
def efn(fn, args, kwargs):
t = time.time()
fn(*args, **kwargs)
return t - time.time()
def runTime(tp=0, count=25):
def dec(fn):
@wraps(fn)
def wrap(*args, **kwargs):
print(fn)
res = tefn if tp else efn
return sum(res(fn, args, kwargs) for _ in range(count)) / count
return wrap
return dec
@runTime()
def fnTuple(): return tuple(char for s in list_ for char in s)
@runTime(tp=1)
def fnIter(): return iter(char for s in list_ for char in s)
@runTime()
def fnList(): return list(char for s in list_ for char in s)
@runTime(tp=1)
def fnYield():
for a in list_: yield from a
@runTime(tp=1)
def fnJoin(): return ''.join(list_)
@runTime()
def fnSumm(): return sum([list(i) for i in list_], [])
@runTime()
def fnReduce(): return reduce(lambda a, x: a + x, map(lambda x: list(x), list_))
@runTime()
def fnNew(): return ['1' * 999, '22' * 999, '333' * 999] * 99
if __name__ == '__main__':
list_ = ['1' * 999, '22' * 999, '333' * 999] * 99
g = globals()
result = list((fn.__name__, fn()) for fn in (g[f] for f in g if f.startswith('fn')))
result.sort(key=lambda r: r[1], reverse=True)
for e, r in enumerate(result):
print(e, r)
出去:
<function fnReduce at 0x02938FA8>
<function fnNew at 0x0293B078>
<function fnList at 0x02938D68>
<function fnTuple at 0x028F7348>
<function fnYield at 0x02938DF8>
<function fnIter at 0x02938CD8>
<function fnJoin at 0x02938E88>
<function fnSumm at 0x02938F18>
0 ('fnNew', 0.0)
1 ('fnJoin', -0.018803834915161133)
2 ('fnYield', -0.04936907768249512)
3 ('fnTuple', -0.061401805877685546)
4 ('fnList', -0.06224835395812988)
5 ('fnIter', -0.07298644065856934)
6 ('fnSumm', -0.8121062469482422)
7 ('fnReduce', -0.8314747619628906)
在一行中的功能:
我解释一下 -
reduce它以一个函数作为输入,该函数组合了按函数拆分列表的结果map。Map接受一个函数和一个初始数组作为输入,这个函数在数组的每个元素上执行。同样可以用下面的代码来表达:建议选项的速度比较:
join在一行结果中使用和关联的变体已经完成了所有工作。这并不奇怪 - 这里的所有操作都很快。适用于任何iterable对象:使用@jfs 答案中的列表生成器的变体非常快:
use 选项
sum在速度上排名第三,但在我看来它失去了直观性:选项开
map-reduce是最慢的。我为什么要用它?因为我喜欢调用链。剩下的就是味道了。然而,即使是 Guido 也讨厌reduce(并functools在python3中呈现)选项 c
collections涵盖了传递的对象可以是不可迭代的(例如,一个数字)的所有情况,但这样做的代价是执行时间很长:由于他们开始在这里收集不同的方式,我将提供:
(现在有人必须比较所有选项的性能:)
你可以这样做:
要从字符串列表中获取字符列表,可以在列表生成器中使用嵌套循环:
类似问题:Flattening a shallow list in Python。
根据@Alex Martelli 的说法,此选项可能比使用
sum(),reduce()的解决方案更快。列表理解解决方案也比reduce().抓住:
出去:
或者