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'不显示在这里?
谢谢
简单地反转字符串怎么样?
>>> 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)
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)