list - 为什么带有步骤的reverse()列表迭代不能正常工作?

标签 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])

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

最佳答案

Reversed 获取一个列表并将其反转。
切片符号迭代列表并返回一个新列表。

当您对列表的切片(带或不带步进)调用 reversed 时,首先创建切片,然后反转。

例如,newL = returned(L[0:len(L):2]) 等同于:

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

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

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

希望这有帮助

关于list - 为什么带有步骤的reverse()列表迭代不能正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17689160/

相关文章:

java - for循环中的条件表达式未按预期运行

c - 从列表中删除元素

python加入 "large"文件

ruby - Ruby for 循环中的两个索引

Java 字符串到字符数组

python - 将列表压缩为带重复的字符串

Excel - 从矩阵到列表

python - 如何从长度为 n 的数组中生成 key

python - 如何在 python 中读取文本文件,然后在同一个文件上写入内容

python-3.x - 如何在 tf2.keras 中进行微调时卡住 BERT 的某些层