小编典典

循环交替的清单

algorithm

给出清单

a = [0,1,2,3,4,5,6,7,8,9]

我怎样才能得到

b = [0,9,1,8,2,7,3,6,4,5]

也就是说,生成一个新列表,其中每个连续元素都从原始列表的两侧交替获取?


阅读 242

收藏
2020-07-28

共1个答案

小编典典

>>> [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[i//2])和结尾(a[-i//2]a交替选择(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之间交替FalseTrue
所以我们从提取的索引a是:0, -1, 1, -2, 2, -3, 3, -4, 4, -5

我对pythonicness的评估:
这种 单线 的优点是它很短并且显示对称性(+i//2-i//2)。
坏的东西,不过,是这种对称是骗人的:
有人可能会认为-i//2是同i//2与翻转的迹象。但是在Python中,整数除法返回结果的下限,而不是截断为零。这样-1//2 == -1
另外,我发现按索引访问列表元素比迭代要少pythonic。

2020-07-28