Проблемы при архивировании двух списков в качестве словаря? - PullRequest
0 голосов
/ 25 октября 2018

У меня есть следующие списки:

a = ['A', 'B', 'C', 'C']

b = ['2', '3', 2, 3]

Я упаковываю их, чтобы получить дикт:

a_dict = dict(zip(a,b))

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

{'A': '2', 'B': '3', 'C': 3}

Какие альтернативы я могу иметь, чтобы иметь что-то подобное?(*):

{'A': '2', 'B': '3', 'C':2, 'C': 3}

Я пытался преобразовать все как кортежи, однако я использую pop для замены некоторых ключей и значений из словаря:

data['A'] = data.pop('B')

Поэтому я не могуиспользуйте формат кортежа.Поэтому, учитывая два приведенных выше списка, как я могу получить (*)?

Ответы [ 3 ]

0 голосов
/ 25 октября 2018

Или defaultdict из collections:

from collections import defaultdict
d=defaultdict(list)
for k,v in zip(a,b):
   d[k].append(v)

А теперь:

print(dict(d))

Вывод:

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

Если заботиться о списках из одного элемента:

print({k:(v if len(v)-1 else v[0]) for k,v in d.items()})

Вывод:

{'A': '2', 'B': '3', 'C': [2, 3]}
0 голосов
/ 25 октября 2018

Ваш желаемый результат не может быть достигнут с помощью диктов.Вы можете разрешить конфликт имен, используя ответ @ blhsing, или использовать наборы, чтобы приблизиться к желаемому результату, так как я подозреваю, что вы хотите проверить уже существующие комбинации в структуре данных, потому что вы пытались использовать кортежи.

c = set(zip(a, b))

, поэтому c становится:

{('B', '3'), ('C', 3), ('A', '2'), ('C', 2)}
0 голосов
/ 25 октября 2018

Наиболее распространенный способ разрешения конфликтов ключей при сохранении большей части преимуществ быстрой индексации dict - это превращение значений в списки:

d = {}
for k, v in zip(a, b):
    d.setdefault(k, []).append(v)

, так что d становится:

{'A': ['2'], 'B': ['3'], 'C': [2, 3]}
...