2010-11-19 29 views
2

我正在编写一个小代码片段来使用列表附加和弹出来反转字符串。使用list.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

这是一个很好的练习来学习递归! – Chris 2010-11-19 19:52:12

+2

只是为了确保:你知道'[] .reverse()',对吧? – nmichaels 2010-11-19 19:55:03

+0

@Nathon - 是的。我只是想知道输出差异的原因。 “ – 2010-11-19 19:57:50

回答

3

如何简单地反转字符串。

>>> 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] 

看到以下内容。由于您正在使用迭代器(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 
+0

感谢您的替代版本我只是想知道我发布的代码段有什么问题 – 2010-11-19 19:55:56

+1

''.join(颠倒('abcd'))也做同样的事情,但根据timeit与清单切片运算符大约快了9倍! – Imran 2010-11-19 20:01:39

+0

完美。感谢您的解释 – 2010-11-19 20:22:12

5
for someChar in strList: 
    reverseCharList.append(strList.pop()) 

是基本上相同:

i = 0 
while i < len(strList): 
    reverseCharList.append(strList.pop()) 
    i += 1 

第一迭代i是0,LEN(strList)是4,并且你弹出+追加 'd'。

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

第三次迭代我是2,len(strList)是2,所以循环条件失败,你就完成了。

(这是真的与列表,而不是一个局部变量“我”。我已经展示了这种方式为清楚起见,在一个迭代完成的。)

如果你想操纵你遍历序列通常使用while循环会更好。例如:

while strList: 
    reverseCharList.append(strList.pop()) 
+0

这是一个很好的解释。有什么地方可以查看关于如何使用迭代器在Python中实现for-in构造函数的具体信息? – 2010-11-19 20:08:51

+0

@sc_ray:我已经包含了迭代器对改变序列效果的简单说明。 – pyfunc 2010-11-19 20:11:04

1

您在弹出时缩短列表。

reverseCharList = [] 
while strList: 
    reverseCharList.append(strList.pop()) 
1

一个简单的recersive版本:

def reverse(the_list): 
    if not the_list: 
     return [] 
    return [the_list.pop()] + reverse(the_list) 

当然,[].reverse()更快。