【问题标题】:why reversed() list iteration with step doesn't work properly?为什么带 step 的 reversed() 列表迭代不能正常工作?
【发布时间】:2013-07-17 00:27:37
【问题描述】:
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])

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

【问题讨论】:

  • 您也可以添加标签#checkio :)

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


【解决方案1】:

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]

希望对你有帮助

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-27
    • 1970-01-01
    • 1970-01-01
    • 2012-06-10
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多