将随机数列表分成两个一组并交替翻转每一对的最快方法是什么?例如:
pleatedTuple=(0, 1, 3, 2, 4, 5, 7, 6, 8, 9)
一次操作我想要什么:
flatPairs=[[0, 1], [2, 3], [4, 5], [6, 7], [8, 9]]
项目将是随机的单个数字,我只是为了便于阅读而将它们按顺序排列。我需要一次完成数千次这样的操作,所以速度是重中之重。 Python 3.6.4。
谢谢你的任何想法,我被这个难住了。
最佳答案
选项 1
只要这是我们正在谈论的对,让我们尝试一个列表理解:
flatPairs = [
[x, y] if i % 2 == 0 else [y, x] for i, (x, y) in enumerate(
zip(pleatedTuple[::2], pleatedTuple[1::2])
)
]
您也可以使用循环从头开始构建它:
flatPairs = []
for i, (x, y) in enumerate(zip(pleatedTuple[::2], pleatedTuple[1::2])):
if i % 2 == 0:
flatPairs.append([x, y])
else:
flatPairs.append([y, x])
print(flatPairs)
[[0, 1], [2, 3], [4, 5], [6, 7], [8, 9]]
选项 2
使用 Ned Batchelder 的 chunking subroutine chunks
并翻转每个备用子列表:
# https://stackoverflow.com/a/312464/4909087
def chunks(l, n):
"""Yield successive n-sized chunks from l."""
for i in range(0, len(l), n):
yield l[i:i + n]
调用 chunks
并耗尽返回的生成器以获得对列表:
flatPairs = list(chunks(pleatedTuple, n=2))
现在,用一个循环反转每一对。
for i in range(1, len(flatPairs), 2):
flatPairs[i] = flatPairs[i][::-1]
print(flatPairs)
[(0, 1), (2, 3), (4, 5), (6, 7), (8, 9)]
请注意,在这种情况下,结果是一个元组列表。
性能
(仅我的回答)
我对性能很感兴趣,所以我决定为我的答案计时:
# Setup
pleatedTuple = tuple(range(100000))
# List comp
21.1 ms ± 1.1 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
# Loop
20.8 ms ± 1.71 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
# chunks
26 ms ± 2.19 ms per loop (mean ± std. dev. of 7 runs, 10 loops each)
为了获得更高的性能,您可以将 chunks
生成器替换为性能更高的替代方案:
flatPairs = list(zip(pleatedTuple[::2], pleatedTuple[1::2]))
然后根据需要循环反转。这大大缩短了时间:
13.1 ms ± 994 µs per loop (mean ± std. dev. of 7 runs, 100 loops each)
2 倍加速,呸!但是请注意,这并不像生成器那样具有内存效率......
关于python - 翻转列表中的每第二对,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49547165/