2015-06-22 10 views
-2

Я начинаю со списка кортежей (a, b). Я хочу закончить список кортежей (b, все a).Список кортежей от (a, все b) до (b, все a)

Например:

FROM 
(a1,[b1,b2,b3]) 
(a2,[b2]) 
(a3,[b1,b2]) 

TO 
(b1,[a1,a3]) 
(b2[a1,a2,a3]) 
(b3,[a1] 

Как сделать это с помощью Python 2? Спасибо за помощь.

+3

Я не понимаю, как вы пришли к этому выводу, можете ли вы объяснить дальше? Кроме того, что вы пробовали до сих пор? Где конкретно вы застряли? – CoryKramer

+0

Использовать метод 'defaultdict' или' dict.setdefault' – Kasramvd

ответ

5

Вы можете использовать collections.defaultdict:

tups = [ 
    ('a1',['b1','b2','b3']), 
    ('a2',['b2']), 
    ('a3',['b1','b2']) 
] 

d = collections.defaultdict(list) 
for a, bs in tups: 
    for b in bs: 
     d[b].append(a) 

Тогда:

>>> d.items() 
[('b1', ['a1', 'a3']), ('b2', ['a1', 'a2', 'a3']), ('b3', ['a1'])] 
+1

Похоже, вы избили меня на 22 года (и у вас был пример для загрузки ... +1 к вам, сэр!) – mgilson

0

Я хотел бы сделать что-то вроде

from collections import defaultdict 

output = defaultdict(list) 

for a, b_s in input: 
    for b in b_s: 
     output[b].append(a) 

# to put back to tuples: 

output = tuple(output.items()) 
+0

Хороший улов, ответ был обновлен – sedavidw

0

сортировочный версия, для удовольствия:

import itertools 
import operator 

# Function to get first element of a tuple 
fst = operator.itemgetter(0) 


def invert(items): 
    # (b, a) pairs, sorted by b 
    pairs = sorted((b, a) for a, bs in items for b in bs) 

    # (b, [(b, a)]) groups 
    groups = itertools.groupby(pairs, key=fst) 

    # (b, [a]) groups 
    return [(b, [a for (_, a) in items]) for b, items in groups] 


print(invert([ 
    ('a1', ['b1', 'b2', 'b3']), 
    ('a2', ['b2']), 
    ('a3', ['b1', 'b2']), 
])) 
Смежные вопросы