反向打印列表不起作用 - Python 3x

时间:2013-12-24 13:10:01

标签: python list

我正在编写一个程序,一直要求用户输入名称,直到输入单词END,此时它会以反向顺序打印出名称列表。

起初,我不知道如何以相反的顺序打印出一个列表,所以我发现了这个:Traverse a list in reverse order in Python

我决定使用reversed()内置函数:

import getpass
import time
import sys
print("Welcome " + getpass.getuser() + "...")
time.sleep(0.25)
print("This program, powered by Python, it will ask you to enter names...")
time.sleep(0.5)
print("...once you have finished, enter END to print off your list")
names = []
while True:
    name = input("Please enter a name: ")
    if name == "END":
        print(reversed(names))
        sys.exit()
    names.append(name)

然而,所有打印的是:

<list_reverseiterator object at 0x0000000002A14F28>

为什么会发生这种情况?我该如何解决这个问题?

非常感谢

6 个答案:

答案 0 :(得分:4)

reversed返回一个迭代器,它将以相反的顺序迭代列表。它不会返回反向列表。这是一个重要的区别,因为如果它返回一个反向列表,那么该列表必须在内存中分配。所以你最终得到它的副本;并且你必须迭代它两次(一次用于创建反转列表,然后一次用于打印它)。

reversed只是在原始列表的末尾开始迭代。如果在创建reversed迭代器后修改列表,则可以很容易地看到这一点:

>>> a = [1,2,3,4,5]
>>> r = reversed(a)
>>> a[2:2] = [10, 11, 12, 13]
>>> a
[1, 2, 10, 11, 12, 13, 3, 4, 5]
>>> list(r)
[12, 11, 10, 2, 1]

反向迭代器只记得索引,它将开始迭代(即索引4)。使用修改后的列表,这不再是列表的结尾。

因此,如果您希望以相反的顺序复制列表,则必须在其上调用list,以便从中创建一个。否则,如果可以,您应该尝试迭代reversed迭代器。

答案 1 :(得分:1)

为了提高效率,reversed返回迭代器对象而不是完整列表。这样,它就不必分配任何额外的空间,或者根本不需要做太多工作,直到用户开始迭代它为止。

正如behzad所指出的,以列表形式获得结果的最简单方法是使用list

>>> seq = [1,2,3]
>>> x = reversed(seq)
>>> print list(x)
[3, 2, 1]

答案 2 :(得分:1)

reversed方法不返回列表。相反,它返回一个迭代器。迭代器是允许您迭代列表,dicts和任何可迭代对象的对象。因此,您需要将其与循环一起使用或将其转换为列表@ behzad.nouri建议:

for item in reversed(names):
    print item

答案 3 :(得分:1)

来自http://docs.python.org/release/2.4.3/whatsnew/node7.html

反向迭代:

一个新的内置函数revers(seq)接受一个序列并返回一个迭代器,它以相反的顺序循环遍历序列的元素。

>>> for i in reversed(xrange(1,4)):
...    print i
... 
3
2
1

在您的方法中使用print list(reversed(names))来打印列表。

固定代码:

import getpass
import time
import sys
print("Welcome " + getpass.getuser() + "...")
time.sleep(0.25)
print("This program, powered by Python, it will ask you to enter names...")
time.sleep(0.5)
print("...once you have finished, enter END to print off your list")
names = []
while True:
    name = input("Please enter a name: ")
    if name == "END":
        print list((reversed(names)))
        sys.exit()
    names.append(name)

输出示例:

['fxvb', 'asd', 'asd']

答案 4 :(得分:1)

reverse(seq)是一个内置函数。获取一个序列并返回一个迭代器,它以相反的顺序循环遍历序列的元素。

>>> x = [1, 2, 3, 4, 5]
>>> for a in reversed(x):
...     print a
... 
5
4
3
2
1

答案 5 :(得分:1)

我建议使用切片 - 效率更高

print(names[::-1]

对于30个字符串的列表,它大约快3倍

In [99]: %timeit names[::-1]
1000000 loops, best of 3: 264 ns per loop
In [103]: %timeit list(reversed(names))
1000000 loops, best of 3: 839 ns per loop