更新:使用extend进行扁平化,但不使用列表解析式,也不使用列表作为迭代器(最快)。
在检查了下一个提供了使用dual for
的列表解析式的更快解决方案后,我做了一点调整,现在它执行得更好了,首先list(...)的执行时间占用了很大的比例,然后将列表解析式改为简单的循环又削减了一些时间。
新的解决方案是:
l = []
for row in output: l.extend(row)
用[]
替换list
的旧方法(速度稍慢但差别不大):
[l.extend(row) for row in output]
旧版(较慢):
使用列表推导式进行扁平化处理
l = []
list(l.extend(row) for row in output)
有时候,只需删除 list(...) 中的括号并使用 [...], 就能获得新的扩展和改进:
import timeit
t = timeit.timeit
o = "output=list(zip(range(1000000000), range(10000000))); l=[]"
steps_ext = "for row in output: l.extend(row)"
steps_ext_old = "list(l.extend(row) for row in output)"
steps_ext_remove_list = "[l.extend(row) for row in output]"
steps_com = "[item for sublist in output for item in sublist]"
print(f"{steps_ext}\n>>>{t(steps_ext, setup=o, number=10)}")
print(f"{steps_ext_remove_list}\n>>>{t(steps_ext_remove_list, setup=o, number=10)}")
print(f"{steps_com}\n>>>{t(steps_com, setup=o, number=10)}")
print(f"{steps_ext_old}\n>>>{t(steps_ext_old, setup=o, number=10)}")
时间测试结果:
for row in output: l.extend(row)
>>> 7.022608777000187
[l.extend(row) for row in output]
>>> 9.155910597999991
[item for sublist in output for item in sublist]
>>> 9.920002304000036
list(l.extend(row) for row in output)
>>> 10.703829122000116
[(12.2817, 12.2817), (0, 0), (8.52, 8.52)]
已经是一个3x2的矩阵了吗?还是我漏掉了什么? - mouad[item for sublist in output for item in sublist]
可以完美地工作,并且它的优点是你的内部元组也可以是列表; 更一般地,任何内部和外部可迭代对象的组合都可以工作。 - Kyss Tao