2011-12-06 163 views
1

我對Python相當陌生,在解決如何將列表理解應用於嵌套列表的一部分(特別是在索引級別)時遇到了困難。嵌套列表和列表解析

舉例來說,如果我有以下幾點:

my_list = [[1,2], [3,7], [6,9], [4,3]] 

new_list = [[i*2 for i in sublist] for sublist in my_list] 

我怎麼會改變我的列表中理解到只適用於操作,以每個子表的索引1?我嘗試了很多,沒有成功。

+1

有沒有在你的代碼中沒有的條件。請說明您希望爲此列表獲得什麼樣的輸出(其中包含語法錯誤,順便說一句)。 –

回答

2

A的mac's更一般的版本:

>>> my_list = [[1,2], [3,7], [6,9], [4,3]] 
>>> new_list = [[v*2 if i==0 else v for i,v in enumerate(sublist)] for sublist in my_list] 
>>> new_list 
[[2, 2], [6, 7], [12, 9], [8, 3]] 
+0

從我自己的答案鏈接。 :) – mac

+0

好神人O.o,不妨使用'itertools.chain',這樣會更有效率。 – Serdalis

0

你的意思是這樣的:

my_list = [[1,2], [3,7], [6,9], [4,3]] 

new_list = [sublist[0]*2 for sublist in my_list] 

Output: 
    new_list == [2, 6, 12, 8] 

也,你忘了把你的子列表之間的逗號(在我的答案固定)

我假設通過「指數1」你的意思是第一元件。
如果您實際上是指第二項(索引1),您將使用sublist[1]而不是sublist[0]

+0

謝謝。在發佈(並更正)後不久,我意識到自己的語法錯誤 - 只是想輸入簡單的代碼,以便我能理解這個概念。我不相信我以前沒有看到它。非常感謝 – donopj2

+0

@ donopj22沒有問題,這是做你想做的?還是你想要不同的東西? – Serdalis

+0

是的,所有的答案其實都非常有幫助。我讚賞大家的意見。 – donopj2

1

您是否正在尋找?

>>> my_list = [[1,2], [3,7], [6,9], [4,3]] 
>>> [[sublist[0] * 2, sublist[1]] for sublist in my_list] 
[[2, 2], [6, 7], [12, 9], [8, 3]] 

編輯:上述解決方案將很好地擴展,如果你有很多元素的子列表。如果這是你的情況下,另一種可能是使用映射:

>>> my_list = [[1,2], [3,7], [6,9], [4,3]] 
>>> def double_first(list_): 
...  list_[0] *= 2 
...  return list_ 
... 
>>> map(double_first, my_list) 
[[2, 2], [6, 7], [12, 9], [8, 3]] 

EDIT2:在我的第一個編輯的解決方案允許實現任何類型的子列表操作的,但如果操作是基本的和只依賴於子列表的索引,Dan's solution將執行得更快。

HTH!