>>> [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]
) of a
,交替地(if i%2 else
)。总共len(a)
数字是被挑选出来的,所以即使这样也不会产生不良影响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
之间交替False
and True
,
所以我们从中提取的索引a
are: 0, -1, 1, -2, 2, -3, 3, -4, 4, -5
.
我对Pythonicness的评价:
这条单线的好处是它很短并且显示出对称性(+i//2
and -i//2
).
但不好的是,这种对称性是具有欺骗性的:
有人可能会认为-i//2
与i//2
标志翻转了。但在Python中,整数除法返回下限 http://python-history.blogspot.de/2010/08/why-pythons-integer-division-floors.html结果而不是截断为零。所以-1//2 == -1
.
另外,我发现通过索引访问列表元素比迭代更不Pythonic。