Python - List.extend没有返回预期值

时间:2014-03-13 07:01:40

标签: python list python-2.7

我试图得到一个列表,所有数字都可以被1000整除。我使用了这段代码:

y = []
for x in range(1000):
    if not x % 3:
        y.extend(str(x))
print y

然而,它只是返回一个看似无序的10以下的整数列表,没有明显的顺序重复(如果你想看到这个列表只是说,但它很长,可能没用)。有谁知道我做错了什么?

4 个答案:

答案 0 :(得分:2)

extend使用其他列表扩展列表。因此,当您尝试使用字符串扩展列表时,它会将数字的数字添加到列表中。

>>> l = []
>>> l.extend(str(12))
>>> l
['1', '2']

要使用的正确运算符为append,它会将列表附加到另一个列表。但你应该这样做:

y = [x for x in xrange(1000) if x%3 == 0] # use xrange in python2

或者只是:

y = range(0, 1000, 3) # thanks to Sebastian for this

答案 1 :(得分:2)

它正在为您提供正确的数字,它只是将它们分成单个字符。

请尝试list.append

y.append(str(x))

你的意思可能更明确。使用x % 3 == 0比使用not x % 3

更有意义

这也可归纳为list comprehension

y = [str(3 * i) for i in range(1000 / 3 + 1)]

或者,更好(在我看来),使用maprange

y = map(str, range(0, 1000, 3))

mapstr函数应用于range生成的列表中的每个项目。

正如评论中所指出的,range创建了一个自己的列表,其大小取决于列表的长度。您可以使用xrange来创建可以相同方式使用的xrange object

y = map(str, xrange(0, 1000, 3))

这可以避免创建中间列表。

您的问题已标记为python2.7但请注意,在Python 3中,range的行为会发生变化,因此它会执行xrange所做的事情。

答案 2 :(得分:0)

做的:

y.append(str(x))

取代

y.extend(str(x))

在扩展的情况下,x被认为是列表。例如,“123”被视为列表,其中包含'1','2','3'作为元素

答案 3 :(得分:0)

另一种解释以及如何修复您的代码段:

这就是list.extend所说的:

>>> help(list.extend)
Help on method_descriptor:

extend(...)
    L.extend(iterable) -- extend list by appending elements from the iterable
>>>

在你的情况下,因为字符串是可迭代的,所以它可以在你的字符串上迭代并转换成字符列表并扩展到原始字符串。

因此,我们可以使用元组或列表而不是str:

来修复您的代码段

使用单元素元组:

y = []
for x in range(1000):
    if not x % 3:
        y.extend((x,))
print y

使用单个元素列表:

y = []
for x in range(1000):
    if not x % 3:
        y.extend([x])
print y