给出清单
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[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之间交替False和True, 所以我们从提取的索引a是:0, -1, 1, -2, 2, -3, 3, -4, 4, -5。
a[i//2]
a[-i//2]
a
if i%2 else
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
0, -1, 1, -2, 2, -3, 3, -4, 4, -5
我对pythonicness的评估: 这种 单线 的优点是它很短并且显示对称性(+i//2和-i//2)。 坏的东西,不过,是这种对称是骗人的: 有人可能会认为-i//2是同i//2与翻转的迹象。但是在Python中,整数除法返回结果的下限,而不是截断为零。这样-1//2 == -1。 另外,我发现按索引访问列表元素比迭代要少pythonic。
+i//2
-i//2
i//2
-1//2 == -1