我有以下名为list
的{{1}}:
flat
我使用flat= ['11','13', '17', '19', '13', '17', '19','22','35','14','15']
函数将其拆分为list
的{{1}},
tuples
具有以下输出:
zip
现在,如何使用列表理解将列表list(zip(flat[0::2], flat[1::2]))
转换为以下结果?
[('11', '13'), ('17', '19'), ('13', '17'), ('19', '22'), ('35', '14')]
答案 0 :(得分:2)
方法1:,无需列表理解
您需要map
zip
反对list
:
list(map(list,zip(flat[0::2], flat[1::2])))
[['11', '13'], ['17', '19'], ['13', '17'], ['19', '22'], ['35', '14']]
方法2 :使用列表理解:
[list(l) for l in zip(flat[0::2], flat[1::2])]
[['11', '13'], ['17', '19'], ['13', '17'], ['19', '22'], ['35', '14']]
或者:
[[l1,l2] for l1,l2 in zip(flat[0::2], flat[1::2])]
[['11', '13'], ['17', '19'], ['13', '17'], ['19', '22'], ['35', '14']]
答案 1 :(得分:2)
纯列表理解方法:
[[flat[a], flat[a+1]] for a in range(0, len(flat)-2, 2)]
此处range(0, len(flat)-2, 2)
允许以2为步长遍历平面数组的索引,而[flat[a], flat[a+1]]
获得一对元素作为列表。如果原始列表的长度不是2的倍数,则此方法将失败。
答案 2 :(得分:1)
使用列表理解,您可以使用:
[[flat[i], flat[i+1]] for i in range(0, len(flat)-1, 2)]
产生
[['11', '13'], ['17', '19'], ['13', '17'], ['19', '22'], ['35', '14']]
答案 3 :(得分:1)
考虑使用itertools避免重复两次复制列表:
import itertools
flat= ['11','13', '17', '19', '13', '17', '19','22','35','14','15']
result = list(
map(list,
zip(
itertools.islice(flat, 0, len(flat), 2),
itertools.islice(flat, 1, len(flat), 2)
)
)
)
print(result)
或使用iter
:
it = iter(flat)
[[x, y] for x, y in zip(it, it)]
这里有live example
使用timeit
进行的测试报告,具有列表理解能力的iter
解决方案是更好的方法:
import itertools
flat= ['11','13', '17', '19', '13', '17', '19','22','35','14','15']
def lcomprehension_aproach(flat):
return [[flat[a], flat[a+1]] for a in range(0, len(flat)-2, 2)]
def itertools_aproach(flat):
result = list(
map(list,
zip(
itertools.islice(flat, 0, len(flat), 2),
itertools.islice(flat, 1, len(flat), 2)
)
)
)
return result
def iter_aproach(flat):
it = iter(flat)
return [[x, y] for x, y in zip(it, it)]
print(lcomprehension_aproach(flat))
print(itertools_aproach(flat))
print(iter_aproach(flat))
from timeit import timeit
print(timeit("lcomprehension_aproach(flat)", globals=globals()))
print(timeit("itertools_aproach(flat)", globals=globals()))
print(timeit("iter_aproach(flat)", globals=globals()))
5.122298364993185 //列表理解时间(杰克·艾德利解决方案)
8.221981940994738 // itertools时间
3.757848952009226 //迭代+理解时间