2014-01-31 2 views
0

У меня есть две параллельных списков, как следующее:Python отображения между списками дубликатов

List1 - List2 
1 -------- A 
1 -------- B 
1 -------- C 
2 -------- D 
2 -------- D 
2 -------- D 
2 -------- E 
2 -------- A 
3 -------- A 
3 -------- L 
3 -------- M 

Ищу быстрый способ в Python, чтобы подсчитать, сколько атрибутов списка 2 карты для различных атрибутов в списке 1. в этом примере я хотел бы получить как выводе:

A maps to 1, 2, 3 
+1

Вы должны показать, что вы пытались, быстро или нет, прежде чем обращаться за помощью. – slider

+0

ОК. Заметил в следующий раз ... – fitziano

ответ

2

Использование zip() к паре значений из обоих списков и collections.defaultdict() производить отображение:

from collections import defaultdict 

mapping = defaultdict(set) 
for v1, v2 in zip(List1, List2): 
    mapping[v2].add(v1) 

Теперь у вас есть значение для сопоставления словаря из списка 2 для множеств, содержащих уникальные значения из списка 1; Вы можете распечатать их, чтобы соответствовать вашему выходу образца с:

for v2 in sorted(mapping): 
    print '{} maps to {}'.format(v2, ', '.join(map(str, sorted(mapping[v2])))) 

Для вашего ввода пробы, это производит:

>>> mapping 
defaultdict(<type 'set'>, {'A': set([1, 2, 3]), 'C': set([1]), 'B': set([1]), 'E': set([2]), 'D': set([2]), 'M': set([3]), 'L': set([3])}) 
>>> for v2 in sorted(mapping): 
...  print '{} maps to {}'.format(v2, ', '.join(map(str, sorted(mapping[v2])))) 
... 
A maps to 1, 2, 3 
B maps to 1 
C maps to 1 
D maps to 2 
E maps to 2 
L maps to 3 
M maps to 3 
1

Использование defaultdict с zip и set:

>>> l1 = [1,1,1,2,2,2,2,2,3,3,3] 
>>> l2 = ['a','b','c','d','d','d','e','a','a','l','m'] 
>>> result = defaultdict(set) 
>>> for v,k in zip(l1,l2): 
...  result[k].add(v) 
... 
>>> result 
defaultdict(<type 'set'>, {'a': set([1, 2, 3]), 'c': set([1]), 'b': set([1]), 
        'e': set([2]), 'd': set([2]), 'm': set([3]), 'l': set([3])}) 
>>> list(result['a']) 
[1, 2, 3] 
Смежные вопросы