2011-10-24 61 views
1

我想重塑以下列表:在一個「長格式」重塑蟒蛇不規則列表

wide_list = [[1,['a','b','c']],[2,['d','e']],[3,'f']] 

long_list = [[1,'a'],[1,'b'],[1,'c'],[2,'d'],[2,'e'],[3,'f']] 

這又如何在Python有效地實現?這可以用一個列表理解來完成

+0

你可以將'wide_list'重寫爲一個有效的Python列表嗎?你錯過了一個右括號,我不想假設它圍繞着最後的'f'。 –

回答

5

嘗試使用嵌套列表理解:

>>> wide_list = [[1,['a','b','c']],[2,['d','e']],[3, ['f']]] 
>>> long_list = [[k, v] for k, sublist in wide_list for v in sublist] 
>>> long_list 
[[1, 'a'], [1, 'b'], [1, 'c'], [2, 'd'], [2, 'e'], [3, 'f']] 

注意,在最後一組,就必須改變以匹配前兩組的格局。而不是[3, 'f'],而是使用[3, ['f']]。否則,對於不遵循該模式的組,您需要特殊的案例邏輯。

+0

非常感謝。我是Pytho的新手,我可以要求澄清嗎?我明白這裏有一個嵌套循環,但語法不是很清楚。 「k,sublist」是否意味着wide_list的每一行中的第一個和第二個元素,然後是「子列表中的v」是否正在循環到子列表的元素中,是正確的? – David

+0

是的,這是一個正確的解釋。請參閱http://docs.python.org/tutorial/datastructures.html#nested-list-comprehensions –

+0

太好了,非常感謝。 – David

2

方式一:

>>> [[x[0],letter] for x in wide_list for letter in x[1]] 
[[1, 'a'], [1, 'b'], [1, 'c'], [2, 'd'], [2, 'e'], [3, 'f']] 
0

使用list comprehensions

long_list = [[x[0],item] for x in wide_list for item in x[1]] 

然而,this answer可能是最清楚的。

+0

-1,因爲你的回答並不處理他的(wide_list)定義中的最終列表,然後+1來撤消它,因爲我意識到他錯誤地指定了這個問題。 –

+0

@KirkStrauser沒問題,我真的注意到並去編輯,然後意識到它是規範,而不是我的代碼。無論哪種方式,雷蒙德的答案是最好的,國際海事組織。 – brc