扭轉和排序我想改變這樣的名單:Python列表從第二個元素
[[x, [1,2,3]], [y, [2,3,4]], [z, 4]]
成爲:
[[1, x], [2, [x,y]], [3, [x,y]], [4, z]]
...基本上是將其「由內向外」,所以內部列表中的數字被分離出來,並且與它們相關的字母被收集到每個數字的列表中。
我該怎麼做?
扭轉和排序我想改變這樣的名單:Python列表從第二個元素
[[x, [1,2,3]], [y, [2,3,4]], [z, 4]]
成爲:
[[1, x], [2, [x,y]], [3, [x,y]], [4, z]]
...基本上是將其「由內向外」,所以內部列表中的數字被分離出來,並且與它們相關的字母被收集到每個數字的列表中。
我該怎麼做?
你可以做到這一點相當直接地使用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'])]
您可以使用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']})
難以理解的列表理解的一點:
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']]]
對我來說,這是絕對不可理解的,你如何從第一個列表中獲得第二個列表。第二種看法:第一行有3個列表,第二行有3個列表,每個列表上有一個列表? – 2015-03-19 13:03:49
我認爲你的問題是有意義的,你的「之前」和「之後」列表中的最後一項實際上應該是'[z,[4]]'和'[4,[y,z]]'...... – 2015-03-19 13:12:28
@Jessica我已經基本上重寫了你的問題,以便更容易理解。如果我誤解了你真正想要的,請說出來。 – 2015-03-19 13:25:15