Преобразуйте два кортежа в Dict одним ключом: несколько значений - PullRequest
0 голосов
/ 04 октября 2019

У меня есть два кортежа, и я хочу иметь возможность конвертировать их в dic с одним ключом и несколькими значениями. Это будет написано на python.

one_tup = [('A',1),('B',2),('C',3)]
two_tup = [('A',2),('B',4),('D',4)]
dic = {'A':(1,2),'B':(2,4),'C':(3),'D':(4)}

Мне было интересно, есть ли более быстрый и эффективный способ сделать это, не просматривая каждый индекс и не сравнивая и не сохраняя его. Потому что это то, что я планирую сделать, но я думаю, что это займет очень много времени, учитывая, что у меня есть около пары тысяч элементов в каждом массиве.

Ответы [ 2 ]

1 голос
/ 04 октября 2019

Вы можете просто использовать itertools и collections.defaultdict, например,

>>> import itertools
>>> from collections import defaultdict
>>> one_tup
[('A', 1), ('B', 2), ('C', 3)]
>>> two_tup
[('A', 2), ('B', 4), ('D', 4)]
>>> d = defaultdict(list)
>>> for key, val in itertools.chain.from_iterable([one_tup, two_tup]):
...   d[key].append(val)
... 
>>> d
defaultdict(<class 'list'>, {'A': [1, 2], 'B': [2, 4], 'C': [3], 'D': [4]})
>>> dict(d)
{'A': [1, 2], 'B': [2, 4], 'C': [3], 'D': [4]}

Примечание: Вы можете использовать defaultdict с set вместо list, если вы этого не сделаетезаботиться о повторяющихся значениях, таких как,

>>> d = defaultdict(set)
>>> for key, val in itertools.chain.from_iterable([one_tup, two_tup]):
...   d[key].add(val)
... 
>>> d
defaultdict(<class 'set'>, {'A': {1, 2}, 'B': {2, 4}, 'C': {3}, 'D': {4}})
>>> dict(d)
{'A': {1, 2}, 'B': {2, 4}, 'C': {3}, 'D': {4}}
0 голосов
/ 04 октября 2019

Обычно алгоритмы не могут быть быстрее, чем O (n) , если только некоторая работа (например, сортировка, индексация и т. Д.) Не была выполнена заранее (или не является предварительным условием). Это имеет смысл, поскольку, если алгоритм работает быстрее, чем O (n) , это означает, что часть входных данных не требуется.

Мы можем, например, использовать defaultdictздесь, а затем сопоставить элементы с кортежами:

from collections import defaultdict

tmp = defaultdict(list)
for subl in (one_tup, two_tup):
    for k, v in subl:
        tmp[k].append(v)

result = {k: tuple(v) for k, v in tmp.items()}

Для данных данного примера это дает нам:

>>> result
{'A': (1, 2), 'B': (2, 4), 'C': (3,), 'D': (4,)}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...