2
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])

If iteration over data[0:len(data):2] starts at item with the last index, why does the iteration over data[0:(len(data)-1):2] does not start at item with index just before the last?

4

1 回答 1

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 中所有其他元素的列表上调用 reversed,从第一个开始,不包括最后一个。

作为旁注,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]

希望这可以帮助

于 2013-07-17T02:11:37.370 回答