我正在编写一个小代码片段来使用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
当我输入字符串abcd时,返回的输出是[d,c]。
我知道我正在改变我正在迭代的列表,但有人可以解释为什么字符'a'和'b'不会显示在这里吗?
由于
答案 0 :(得分:5)
for someChar in strList:
reverseCharList.append(strList.pop())
基本上与:
相同i = 0
while i < len(strList):
reverseCharList.append(strList.pop())
i += 1
第一次迭代我是0,len(strList)是4,你弹出+追加'd'。
第二次迭代我是1,len(strList)是3,你弹出+追加'c'。
第三次迭代我是2,len(strList)是2,所以循环条件失败并且你已经完成了。
(这是通过列表上的迭代器完成的,而不是局部变量'i'。为了清楚起见,我已经这样做了。)
如果你想操纵你正在迭代的序列,通常最好使用while循环。例如:
while strList:
reverseCharList.append(strList.pop())
答案 1 :(得分:4)
如何简单地逆转字符串。
>>> x = 'abcd'
>>> x[::-1]
'dcba'
>>>
在你的代码上:
永远不要改变你正在迭代的列表。它可能会导致细微的错误。
>>> 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]
请参阅以下内容。因为你正在使用iterator(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
答案 2 :(得分:1)
弹出时缩短列表。
reverseCharList = []
while strList:
reverseCharList.append(strList.pop())
答案 3 :(得分:1)
一个简单的递归版本:
def reverse(the_list):
if not the_list:
return []
return [the_list.pop()] + reverse(the_list)
当然,[].reverse()
更快。