扭转和排序我想改变这样的名单: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