用一个键将两个元组覆盖为Dict:多个值

时间:2019-10-04 14:53:38

标签: python django

我有两个元组,并且我希望能够使用一个键和多个值将它们转换为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 个答案:

答案 0 :(得分:1)

您可以像这样使用itertoolscollections.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]}

注意:如果您不关心重复值,例如,可以将defaultdictset一起使用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}}

答案 1 :(得分:0)

通常,算法不能快于 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,)}