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

时间:2010-11-19 19:50:20

标签: python loops stack reverse

我正在编写一个小代码片段来使用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'不会显示在这里吗?

由于

4 个答案:

答案 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()更快。