2017-09-16 30 views
-1

添加新的元素我有清單列表如下圖所示:末在列表中的每個內部列表在Python

[[1,345,0,304],[0,345,678,946,90],[0,23,3,56,3,5,9,0]] 

現在我要一個新號碼(相同數量)附加到每個內部列表最後。

所以結果應該是這樣的:

[[1,345,0,304,90],[0,345,678,946,90,90],[0,23,3,56,3,5,9,0,90]] 

我想用一個列表理解,因爲我不想通過遍歷主列表中的每個內部列表做的正常方式,然後使用一個臨時列表添加到它。

任何幫助?

+1

通過闡明你的意圖,你可以在改善這個問題方面走很長的路。你聲稱你想使用列表理解附加到每個列表,但是你選擇了一個創建副本的答案,追加到那些列表而不是你提到的列表。如果這就是你想要的,請編輯你的問題來說清楚。 –

回答

1

途徑

機Python(@acushner呈現這首):

lsts = [[1,345,0,304], [0,345,678,946,90], [0,23,3,56,3,5,9,0]] 
[lst + [90] for lst in lsts] 

或者,itertools.chain

import itertools as it 

[list(it.chain(lst, [90])) for lst in lsts] 

爲了好玩,第三方庫more-itertoolspip install more_itertools):

import more_itertools as mit 

[list(mit.padded(lst, fillvalue=90, n=len(lst)+1)) for lst in lsts] 

買者

一些答案嘗試變異,而迭代的列表。雖然這些選項給出了相同的結果,但是對於這個特定問題,可能更高的內存效率並且對於更大的數據甚至可能更快,但它們可以說是非pythonic而不是推薦的實踐。

Python docs

它有時很有誘惑力,而你是遍歷它改變的列表;但是,創建新列表通常更簡單,更安全。

當迭代它時,這在來自列表的removinginserting10元素時尤其如此。後一種方法採用這種創建新清單的慣例。但是,對於某些無害circumstances,可以採取折中的遍歷嵌套列表的副本:

lists = [[1,345,0,304], [0,345,678,946,90], [0,23,3,56,3,5,9,0]] 
for lst in lists[:]: 
    lst.append(90) 
lists 

,否則默認爲@ acushner的做法,這是本文所討論的下一個高性能的選擇。

+0

這是非常浪費的,因爲它會創建列表的副本。事實上,它並沒有追加每個列表。它創建了全新的列表。想象一下1000x1000列表的漸近情況。 –

+0

沒有副本。新列表已創建。這是有意的,並且是Python中列表解析的常見約定。你有什麼建議? – pylang

3

你可以用列表除了做到這一點:

[l + [90] for l in lists] 
+0

這是非常浪費的,因爲它會創建列表的副本。事實上,它並沒有追加每個列表。它創建了全新的列表。想象一下1000x1000列表的漸近情況。 –

+0

@AryaMcCarthy是的,這是浪費,但如果你讀OP的問題,這是他/她想要的。 – acushner

0

這也適用

lists = [[1,345,0,304],[0,345,678,946,90],[0,23,3,56,3,5,9,0]] 
[l.append(90) for l in lists] 
print(lists) 

[[1,345,0,304,90],[0,345,678,946,90,90],[0,23,3, 56,3, 5,9,0,90]]

+2

該解決方案最好,因爲它改變了數據結構而不是創建一個新的數據結構。這就是說,這不是你應該如何使用列表解析。這個問題最好用for循環來回答。 –

+0

你能解釋爲什麼不應該使用列表推導? – Simon

+0

@Serjik這是不正確的。它不會工作,因爲追加返回無 – Baktaawar

0

另一個選項

lists = [[1,345,0,304], [0,345,678,946,90], [0,23,3,56,3,5,9,0]] 

for lst in lists: 
    lst.append(90) 

print lists 
[[1, 345, 0, 304, 90],[0, 345, 678, 946, 90, 90],[0, 23, 3, 56, 3, 5, 9, 0, 90]] 
+0

考慮改變嵌套列表的副本(請參閱文章以獲取基本原理)。另外爲了清楚起見,我會交換'lst'和'lists'的名字。否則,這是一個很好的答案。 – pylang

+0

@pylang這種方法怎麼了? – mwweb

+0

突變你正在迭代的同一個列表並不是一個好習慣。在這種情況下,因爲您不移除項目,所以它是無害的,但更安全的習慣是迭代副本,例如, '列表[:]'。有這種類型的帖子https://stackoverflow.com/questions/1637807/modifying-list-while-iterating。只需在列表[:]中替換'lst:'。 – pylang

0

而另一種:

lists = [[1,345,0,304],[0,345,678,946,90],[0,23,3,56,3,5,9,0]] 
for _ in map(lambda x: x.append(90), lists): 
    pass 
相關問題