Cycle a list from alternating sides(从交替的侧面循环列表)
问题描述
给定一个列表
a = [0,1,2,3,4,5,6,7,8,9]我怎样才能得到
b = [0,9,1,8,2,7,3,6,4,5]也就是说,产生一个新的列表,其中每个连续的元素都是从原始列表的两侧交替取出的?
>>>[a[-i//2] if i % 2 else a[i//2] for i in range(len(a))][0, 9, 1, 8, 2, 7, 3, 6, 4, 5]解释:
此代码从 a<的开头 (p>a[i//2]) 和结尾 (a[-i//2]) 选择数字/code>,交替(if i%2 else).总共选择了 len(a) 个数字,因此即使 len(a) 是奇数,这也不会产生不良影响.[-i//2 for i in range(len(a))] 产生 0, -1, -1, -2, -2, -3, -3, -4, -4, -5,[ i//2 for i in range(len(a))] 产生 0, 0, 1, 1, 2, 2, 3, 3, 4, 4,i%2 在 False 和 True 之间交替,
所以我们从 a 中提取的索引是:0, -1, 1, -2, 2, -3, 3, -4, 4, -5.
我对 pythonicness 的评价:
这个单线的好处是它很短并且显示出对称性(+i//2 和 -i//2).
但不好的是,这种对称性具有欺骗性:
有人可能会认为 -i//2 与 i//2 相同,只是符号翻转了.但在 Python 中,整数除法返回底数 的结果,而不是向零截断.所以 -1//2 == -1.
此外,我发现通过索引访问列表元素的方式比迭代更少.
Given a list
a = [0,1,2,3,4,5,6,7,8,9]
how can I get
b = [0,9,1,8,2,7,3,6,4,5]
That is, produce a new list in which each successive element is alternately taken from the two sides of the original list?
>>> [a[-i//2] if i % 2 else a[i//2] for i in range(len(a))]
[0, 9, 1, 8, 2, 7, 3, 6, 4, 5]
Explanation:
This code picks numbers from the beginning (a[i//2]) and from the end (a[-i//2]) of a, alternatingly (if i%2 else). A total of len(a) numbers are picked, so this produces no ill effects even if len(a) is odd.
[-i//2 for i in range(len(a))] yields 0, -1, -1, -2, -2, -3, -3, -4, -4, -5,
[ i//2 for i in range(len(a))] yields 0, 0, 1, 1, 2, 2, 3, 3, 4, 4,
and i%2 alternates between False and True,
so the indices we extract from a are: 0, -1, 1, -2, 2, -3, 3, -4, 4, -5.
My assessment of pythonicness:
The nice thing about this one-liner is that it's short and shows symmetry (+i//2 and -i//2).
The bad thing, though, is that this symmetry is deceptive:
One might think that -i//2 were the same as i//2 with the sign flipped. But in Python, integer division returns the floor of the result instead of truncating towards zero. So -1//2 == -1.
Also, I find accessing list elements by index less pythonic than iteration.
这篇关于从交替的侧面循环列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持编程学习网!
本文标题为:从交替的侧面循环列表
基础教程推荐
- 将 x 轴刻度更改为自定义字符串 2022-01-01
- pyserial - 可以从线程 a 写入串行端口,是否阻塞从线程 b 读取? 2022-01-01
- 尝试制作WhatsApp机器人 2022-01-01
- 使用生成器和迭代器时 Python 多循环失败 2022-01-01
- 由Python将MP3转换为MIDI(类型错误:无法加载插件:mtg-Melodia:Melodia) 2022-01-01
- Discord.py 缺少必需的参数 2022-01-01
- numpy float:比算术运算中内置的慢 10 倍? 2022-01-01
- 在 Celery 工作人员中捕获 Heroku SIGTERM 以优雅地关 2022-01-01
- 与常规 dict 相比,Python manager.dict() 非常慢 2022-01-01
- 用 Python 编写 Fortran 无格式文件 2022-01-01
