簡體   English   中英

python list comprehension和extend()

[英]python list comprehension and 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]

前兩個擴展按預期方式工作,但是在列表理解中壓縮相同內容時會失敗。 我究竟做錯了什么?

extend就地修改列表。

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

extend的返回值為None

list.extend() 在適當位置擴展列表。 在原位更改對象的Python標准庫方法始終返回None (默認值); 您的列表a.extend()執行了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']

extend函數使用您就地提供的值擴展列表,並返回None 這就是為什么列表中有兩個None值的原因。 我建議您這樣重寫自己的理解:

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

對於python列表,更改列表的方法將在適當位置工作並返回None 這適用於extend以及appendremoveinsert ,...

為了回答一個較早的問題,我繪制了list的子類,該子類的行為與您期望的list

為什么[] .append()在python中不起作用?

這是出於教育目的。 對於利弊..請看我回答的評論。

我喜歡這種方法,因為它具有鏈接方法和流暢工作的能力,例如

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

可能的。

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM