python list comprehension和extend()

时间:2013-11-20 11:20:31

标签: python list-comprehension extend

进入Python(2.7.1) 但是没有理解(数小时)这个:

>>> a = [1, 2]
>>> b = [3, 4]
>>> 
>>> a.extend([b[0]])
>>> a
[1, 2, 3]
>>> 
>>> a.extend([b[1]])
>>> a
[1, 2, 3, 4]
>>> 
>>> m = [a.extend([b[i]]) for i in range(len(b))] # list of lists
>>> m
[None, None]

前两个扩展按预期工作,但是当在列表推导中压缩它时失败。 我做错了什么?

6 个答案:

答案 0 :(得分:5)

extend就地修改了列表。

>>> [a + b[0:i] for i in range(len(b)+1)]
[[1, 2], [1, 2, 3], [1, 2, 3, 4]]

答案 1 :(得分:2)

extend的返回值为None

答案 2 :(得分:2)

list.extend()扩展了列表。在就地改变对象的Python标准库方法总是返回None(默认值);您的列表理解执行了a.extend()两次,因此结果列表包含两个None返回值。

你的a.extend()来电正常工作;如果你要打印a,它会显示:

[1, 2, 3, 4, 3, 4]

您在Python解释器中看不到None返回值,因为解释器从不回显None结果。您可以明确地测试它:

>>> a = []
>>> a.extend(['foo', 'bar']) is None
True
>>> a
['foo', 'bar']

答案 3 :(得分:2)

extend函数使用您在原地提供的值扩展列表并返回None。这就是为什么列表中有两个None值的原因。我建议你像这样改写你的理解:

a = [1, 2]
b = [3, 4]
m = [a + [v] for v in b] # m is [[1,2,3],[1,2,4]]

答案 4 :(得分:1)

对于python列表,更改列表的方法在适当的位置工作并返回None。这适用于extend以及appendremoveinsert,...

在回答一个较旧的问题时,我勾勒出一个list的子类,其行为符合预期list的效果。

Why does [].append() not work in python?

这是教育性的。为了利弊..​​看看我的答案的评论。

我喜欢这种方法,因为它能够链接方法并以流畅的方式工作,例如:

之类的东西
li = FluentList()
li.extend([1,4,6]).remove(4).append(7).insert(1,10).reverse().sort(key=lambda x:x%2)

是可能的。

答案 5 :(得分:0)

a.extend()返回None

你可能想要其中一个:

>>> m = a + b
>>> m
[1, 2, 3, 4]
>>> a.extend(b)
>>> a
[1, 2, 3, 4]

除此之外,如果你想迭代列表中的所有元素,你就可以这样做:

m = [somefunction(element) for element in somelist]

for element in somelist:
    do_some_thing(element)

在大多数情况下,无需查看指数。

如果你只想在列表中添加一个元素,你应该使用somelist.append(element)而不是`somelist.extend([element])