我有两个元组,并且我希望能够使用一个键和多个值将它们转换为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)}
我想知道是否有一种更快,更高效的方法,而无需遍历每个索引并进行比较然后存储。因为这是我打算做的事情,但是考虑到每个数组中有大约两千个元素,我认为这将花费很长时间。
答案 0 :(得分:1)
您可以像这样使用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}}
答案 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,)}