2015-10-08 34 views
2

我有两个整数A和B的列表,长度相同。列表A是无序列表整数,而列表B是有重复列表的整数列表(按升序排列)。是否有一个更具时间效率的方式来填充字典

A和B是这样创建的,使得两两无配对A [i],B [i]是相同的。

我的目标是创建一个从拍摄键值,与值的字典从B中两两匹配A [1],即

myDict = {} 

for i in A: 
    myDict[i] = [] 

for i in range(len(A)): 
    targetA = A[i] 
    targetB = B[i] 
    if targetA in myDict.keys(): 
     myDict[targetA].append(targetB) 

对于非常大的数据集,这是采取一个极其长时间。有没有另外一种方法最后提出相同的字典,可能通过利用B的排序结构?

+0

http://www.tutorialspoint.com/python/dictionary_update.htm – kay

+0

是purchaseDict应该是myDict? – Darcinon

+0

@Darcinon哎呀,是的,修正 – maybe

回答

2

您可以使用defaultdict这应该是简单,更快捷:

from collections import defaultdict 

A = [6, 6, 3, 2, 5, 2, 3] 
B = [1, 2, 3, 3, 4, 6, 7] 

purchase_dict = defaultdict(list) 
for key, value in zip(A, B): 
    purchase_dict[key].append(value) 

docs

当每个键遇到的第一次,它是不是已经在映射;因此使用default_factory函数自动创建一个条目,该函数返回一个空列表。然后list.append()操作将该值附加到新列表。当再次遇到密钥时,查找正常进行(返回该密钥的列表),并且list.append()操作将向列表中添加另一个值。这种技术比使用dict.setdefault()的等效技术更简单快捷。

你会得到什么:

>>> purchase_dict 
defaultdict(<class 'list'>, {2: [3, 6], 3: [3, 7], 5: [4], 6: [1, 2]}) 
>>> purchase_dict[2] 
[3, 6] 
+1

为什么不使用zip(A,B),而不是A = b(a,b)中的pairs = [(a,b)]? – Darcinon

+1

该解决方案速度非常快。感谢您的帮助。 – maybe

+1

即对于密钥,zip中的值(A,B):... – Darcinon

相关问题