2015-08-21 4 views
0

У меня есть особая проблема, которая меня озадачила. Предположим, у меня есть следующие два списка:Создание словаря массивов с двумя списками с Python

x = ["A","B","C","D","E"] 
y = [1,2,3,2,1] 

x и y имеют отношения. Связь привязана по индексу. То есть «A» относится к 1, «B», относящемуся к 2, «C», относящимся к 3 и так далее.

То, что я пытаюсь сделать, это создать отношение ключевого значения, когда уникальные элементы в y являются ключами, и каждый ключ имеет список, содержащий буквы, относящиеся к ключу, как упоминалось ранее. Я попытался сделать следующее:

mapping = dict(zip(y,x)) 
{1: 'E', 2: 'D', 3: 'C'} 

Это перезаписывает предыдущую букву. Я хотел бы иметь возможность вернуть следующее:

{1:['A','E'], 2:['B','D'], 3:['C']} 

У кого-нибудь есть умное решение? Предпочтительно без itertools.

ответ

6

Вы можете использовать setdefault

x = ["A","B","C","D","E"] 
y = [1,2,3,2,1] 
d = {} 
for i,j in zip(y,x): 
    d.setdefault(i, []).append(j) 
print d 

Выход:

{1: ['A', 'E'], 2: ['B', 'D'], 3: ['C']} 
2

defaultdict мои предпочтения для таких ситуаций.

from collections import defaultdict 

x = ["A","B","C","D","E"] 
y = [1,2,3,2,1] 
D = defaultdict(list) 

for i, j in zip(x, y): 
    D[j].append(i) 

print dict(D) 

Выход:

{1: ['A', 'E'], 2: ['B', 'D'], 3: ['C']} 
+1

У меня нет никаких комментариев по точности вашего ответа, или о том, как полезно таком Ответ заключается в том, когда был задан дублирующий вопрос, прежде чем у этого вопроса были какие-либо ответы. Я просто пытаюсь успокоить вас и объяснить, что иногда вы будете забиты, и иногда нисходящий не оставит комментария. Сделайте глубокий вдох и расслабьтесь; это не biggie. :) – TigerhawkT3

0

Вот простой (не умный) решение. Я бы сказал, что простое решение больше соответствует философии питонов, чем умному решению. Perl - это язык, призванный максимизировать ум, imho, и я нахожу его почти нечитаемым (по общему признанию, я его избегаю, если я могу быть неопытным программистом Perl).

x = ["A","B","C","D","E"] 
y = [1,2,3,2,1] 

assert(len(x) == len(y)) 

d = {} 
for i in range(len(x)): 
    key = y[i] 
    val = x[i] 

    if key in d: 
     d[key].append(val) 
    else: 
     d[key] = [val, ] 

print d 
+0

Философски это тоже не чисто питоновское решение. См. Https://docs.python.org/2/glossary.html#term-eafp – therealrootuser

+0

'if..else', как это просто отлично. – TigerhawkT3

+0

@ mattingly890 Возможно, но вы знаете, что здесь вы получите недопустимые ключи .. так что предположение, что вы не выглядите немного сломанным. Например, вполне разумно, чтобы каждый цикл генерировал исключение в этом случае. Но я догадываюсь об этом. Например. см. здесь http://stackoverflow.com/questions/180937/are-exceptions-really-for-exceptional-errors и http: // stackoverflow.com/questions/3086806/python-exceptions-eafp-and-what-is-really-exclusive этот код, поскольку он говорит о том, что недостающие ключи являются обычным явлением. –

1

Вот умный, но O(n^2) и поэтому не советовал решение, которое я придумал, используя комбинацию словаря & списка понимания Python.

>>> x = ["A","B","C","D","E"] 
>>> y = [1,2,3,2,1] 
>>> {y[i] : [x[j] for j in range(len(y)) if y[j] == y[i]] for i in range(len(y))} 
{1: ['A', 'E'], 2: ['B', 'D'], 3: ['C']} 

За что его ценность, @Joe R и @ mattingly890 решение пути, так как они являются O(n) решения

Смежные вопросы