2015-03-19 2 views
-1

Я хочу, чтобы преобразовать список вроде этого:список питон реверс и сортировки из второго элемента

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

стать:

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

... по сути превращая его «наизнанку», так что числа в самых внутренних списках выделяются, а связанные с ними письма собираются в списки для каждого номера.

Как я могу это сделать?

+1

Для меня совершенно непонятно, как вы получили второй список из первого. На втором взгляде: Есть ли 3 списка в первой строке и 3 списка на втором, по одному списку по каждому? –

+1

Я думаю, что последние элементы в списках «before» и «after» должны быть фактически '[z, [4]]' и '[4, [y, z]]', так как ваш вопрос имеет смысл ... –

+0

@Jessica Я существенно переписал ваш вопрос, чтобы его было легче понять. Если я неверно истолковал то, что вы на самом деле хотите, пожалуйста, говорите. –

ответ

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']]] 
Смежные вопросы