为什么reverse()列表迭代步骤不能正常工作?

时间:2013-07-17 00:27:38

标签: list for-loop python-3.x iteration listiterator

def checkio(data):
   s1=[]
   s2=[]
   data.sort()
   for x in reversed(data[0:len(data):2]):
       s1.append(x)
   for y in reversed(data[0:(len(data)-1):2]):
       s2.append(y)
   print(s1, s2)

checkio([5, 8, 13, 27, 14])

如果对数据[0:len(data):2]的迭代从具有最后一个索引的项开始,为什么迭代数据[0:(len(data)-1):2]不会从项目开始索引就在最后一个之前?

1 个答案:

答案 0 :(得分:2)

Reversed列出并反转它。
切片符号在列表上迭代并返回一个新符号。

当您在切片上调用reversed(有或没有步进)时,首先创建切片,然后反转切片。

例如,newL = reversed(L[0:len(L):2])与:

相同
M = L[0:len(L):2]
newL = reversed(M)

因此,当你说reversed(L[0:len(L)-1:2])时,在包含L中所有其他元素的列表中调用reverse,从第一个元素开始,并排除最后一个元素。

作为旁注,L[::2]L[0:len(L):2]相同,L[:-1:2]L[0:len(L)-1:2]相同。此外,L[::-1]的排序顺序为L 这种表示法非常强大。

如果您希望checkio([5, 8, 13, 27, 14])返回[14, 13, 5, 27, 8],则可通过以下几种方式进行操作:

>>> L = [5, 8, 13, 27, 14]
>>> L[::-2] + L[-2::-2]
[14, 13, 5, 27, 8]

>>> L = [5, 8, 13, 27, 14]
>>> list(reversed(L))[::2] + list(reversed(L))[1::2]
[14, 13, 5, 27, 8]

>>> L = [5, 8, 13, 27, 14]
>>> list(itertools.chain(itertools.islice(reversed(L), 0, len(L), 2), itertools.islice(reversed(L), 1, len(L), 2)))
[14, 13, 5, 27, 8]

希望这有帮助