使用list.pop()反转列表的问题

sc_*_*ray 3 python stack reverse loops

我正在编写一个小代码片段来使用list append和pop来反转字符串.

我写的脚本如下:

someStr = raw_input("Enter some string here:")
strList = []
for c in someStr:
    strList.append(c)

print strList

reverseCharList = []
for someChar in strList:
    reverseCharList.append(strList.pop())

print reverseCharList
Run Code Online (Sandbox Code Playgroud)

当我输入字符串abcd时,返回的输出是[d,c].

我知道我正在改变我正在迭代的列表,但有人可以解释为什么字符'a'和'b'不显示在这里?

谢谢

pyf*_*unc 5

简单地反转字符串怎么样?

>>> x = 'abcd'
>>> x[::-1]
'dcba'
>>> 
Run Code Online (Sandbox Code Playgroud)

在你的代码上:

切勿改变您正在迭代的列表。它可能会导致细微的错误。

>>> strList = [1, 2, 3, 4, 5]
>>> reverseCharList = []
>>> for someChar in strList:
...     print strList
...     reverseCharList.append(strList.pop())
...     print strList
... 
[1, 2, 3, 4, 5]   <-- Iteration 1
[1, 2, 3, 4]
[1, 2, 3, 4]      <-- Iteration 2
[1, 2, 3]
[1, 2, 3]         <-- Iteration 3
[1, 2]
Run Code Online (Sandbox Code Playgroud)

请参阅以下内容。由于您正在使用迭代器(for .. in ..)。您可以直接查看迭代器详细信息以及改变列表如何与迭代器混淆。

>>> strList = [1, 2, 3, 4, 5]
>>> k = strList.__iter__()
>>> k.next()
1
>>> k.__length_hint__()   <--- Still 4 to go
4
>>> strList.pop()         <---- You pop an element
5
>>> k.__length_hint__()   <----- Now only 3 to go
3
>>> 
>>> k.next()
2
>>> k.__length_hint__()
2
Run Code Online (Sandbox Code Playgroud)


Lau*_*ves 5

for someChar in strList:
    reverseCharList.append(strList.pop())
Run Code Online (Sandbox Code Playgroud)

基本上与以下相同:

i = 0
while i < len(strList):
    reverseCharList.append(strList.pop())
    i += 1
Run Code Online (Sandbox Code Playgroud)

第一次迭代i为0,len(strList)为4,你弹出+追加'd'.

第二次迭代我是1,len(strList)是3,你弹出+追加'c'.

第三次迭代我是2,len(strList)是2,所以循环条件失败并且你已经完成了.

(这实际上是通过列表中的迭代器完成的,而不是局部变量'i'.为了清楚起见,我已经这样做了.)

如果你想操纵你正在迭代的序列,通常最好使用while循环.例如:

while strList:
    reverseCharList.append(strList.pop())
Run Code Online (Sandbox Code Playgroud)