python - 翻转列表中的每第二对

标签 python

将随机数列表分成两个一组并交替翻转每一对的最快方法是什么?例如:

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/

相关文章:

python - Neo4j 处理数据快吗?对我来说太慢了

python - 如何在 Python 中将 N 毫秒添加到日期时间

python - 在遗留代码评估的格式字符串中执行计算

python - IO错误 : [Errno 13] Permission denied How do I fix this?

python - MySQL Python 日期和列表错误

python - 如何在Python Maya中存储floatSliderGrp的值

python - 使用 git 在 Python 网络服务器中自动增加版本号

python - 如何从两个范围中获取一个随机 float (python)

python - Python 中的 3n+1 编程挑战

python - 将字符串(拆分)转换为列表?