2013-08-03 182 views
3

確定的名單,所以我必須列出列表修真名單

list = [['a','b','c'], ['1','2','3'], ['x','y','z']] 

的名單,我想編輯每個列表的第一個項目,因此之前它有一個象徵。一個 」?」在這個例子中。我想我可以使用列表理解來做到這一點。類似的東西:

list = ['?'+x for x in i[0] for i in list] 

但這只是給了我一個錯誤。這個列表理解的東西讓我困惑,我該怎麼做?

+1

不要將列表命名爲list,它會掩蓋內置類型。 –

回答

5

l = [['?' + i[0]] + i[1:] for i in l] (l is the list you pass in) 
+1

讓我再次重申:不要命名一個變量'list';您通過這樣做掩蓋了內置類型。 –

+0

@MartijnPieters,好吧,我聽到你。我只是不知道有一個內置的列表。它有什麼作用? – Nathan

+0

@Nathan它返回一個列表對象。 – SethMMorton

3

首先,不要命名變量list;您現在正在屏蔽built-in list() type,並且如果您希望list()在代碼中的其他位置仍然是該類型,則很容易導致出現錯誤。

要前置字符串到每個嵌套列表的第一個元素,使用一個簡單的列表理解:

outerlist = [['?' + sub[0]] + sub[1:] for sub in outerlist] 

這從嵌套列表,通過連接一個元素列表與所述第一建立一個新的列表元素更改,加上子列表的其餘部分。

演示:

>>> outerlist = [['a','b','c'], ['1','2','3'], ['x','y','z']] 
>>> [['?' + sub[0]] + sub[1:] for sub in outerlist] 
[['?a', 'b', 'c'], ['?1', '2', '3'], ['?x', 'y', 'z']] 
+0

等待,這不起作用...這只是給我'外表'沒有定義。如果我用列表替換外部列表沒有任何變化 – Nathan

+0

@Nathan:我使用了一個不同的名稱,不掩蓋內置。示例代碼不會重新分配結果;使用'outerlist = [...]'來分配它。 –

0
>>> [['?' + el if i==0 else el for i,el in enumerate(subl)] for subl in L] 
[['?a', 'b', 'c'], ['?1', '2', '3'], ['?x', 'y', 'z']] 

此外,如果您希望修改初始列表,你可以修改它就地而無需創建一個新問題:

>>> for sublist in L: 
    sublist[0] = '?' + sublist[0] 
>>> L 
[['?a', 'b', 'c'], ['?1', '2', '3'], ['?x', 'y', 'z']] 
0

這應該工作:

>>> l = [['a','b','c'], ['1','2','3'], ['x','y','z']] 
>>> [["?"+a,b,c] for [a,b,c] in l] 
[['?a', 'b', 'c'], ['?1', '2', '3'], ['?x', 'y', 'z']] 
>>>