2015-03-19 224 views
-1

扭轉和排序我想改變這樣的名單:Python列表從第二個元素

[[x, [1,2,3]], [y, [2,3,4]], [z, 4]] 

成爲:

[[1, x], [2, [x,y]], [3, [x,y]], [4, z]] 

...基本上是將其「由內向外」,所以內部列表中的數字被分離出來,並且與它們相關的字母被收集到每個數字的列表中。

我該怎麼做?

+1

對我來說,這是絕對不可理解的,你如何從第一個列表中獲得第二個列表。第二種看法:第一行有3個列表,第二行有3個列表,每個列表上有一個列表? – 2015-03-19 13:03:49

+1

我認爲你的問題是有意義的,你的「之前」和「之後」列表中的最後一項實際上應該是'[z,[4]]'和'[4,[y,z]]'...... – 2015-03-19 13:12:28

+0

@Jessica我已經基本上重寫了你的問題,以便更容易理解。如果我誤解了你真正想要的,請說出來。 – 2015-03-19 13:25:15

回答

2

你可以做到這一點相當直接地使用defaultdict

from collections import defaultdict 

data = [['x', [1, 2, 3]], ['y', [2, 3, 4]], ['z', [4]]] 

temp = defaultdict(list) 

for k, s in data: 
    for v in s: 
     temp[v].append(k) 

result = sorted(temp.items()) 
# [(1, ['x']), (2, ['x', 'y']), (3, ['x', 'y']), (4, ['y', 'z'])] 
1

您可以使用collections.defaultdict

>>> d=defaultdict(list) 
>>> for k,v in l: 
...  if isinstance(v,list): 
...    for t in v: 
...     d[t].append(k) 
...  else: 
...     d[v].append(k) 
... 
>>> d 
defaultdict(<type 'list'>, {1: ['x'], 2: ['x', 'y'], 3: ['x', 'y'], 4: ['y', 'z']}) 
0

難以理解的列表理解的一點:

in_list = ['x', [1, 2, 3]], ['y', [2, 3, 4]], ['z', [4]] 
[[num, [sublist[0] for sublist in in_list if num in sublist[1]]] for num in sorted(list(set(num for sublist in in_list for num in sublist[1])))] 

得到:

Out[218]: [[1, ['x']], [2, ['x', 'y']], [3, ['x', 'y']], [4, ['y', 'z']]] 
相關問題