加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Python > 正文

python – 翻转列表中的每个第二对

发布时间:2020-12-20 12:14:01 所属栏目:Python 来源:网络整理
导读:什么是将随机数列表分成两组的最快方法,交替翻转每一对?例如: pleatedTuple=(0,1,3,2,4,5,7,6,8,9) 我想在一次操作中: flatPairs=[[0,1],[2,3],[4,5],[6,7],[8,9]] 项目将是随机的单个数字,我只是为了可读性而使它们顺序.我需要在运行中完成数千个这样的
什么是将随机数列表分成两组的最快方法,交替翻转每一对?例如:

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,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,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]

调用块并耗尽返回的生成器以获取对的列表:

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)

为了获得更高的性能,您可以使用更高性能的替代方案替换块生成器:

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倍,p!但要注意,这并不像发电机那样具有内存效率……

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读