首页 > 解决方案 > 如何一次从 2 个列表的产品中动态创建字典

问题描述

我有大量的迭代(~60000),每次我得到 2 个列表。
我需要保留有关第一个/第二个列表中每个可能的项目组合的一些信息。如果重复了一对,我想数一数-不加,这就是我认为字典更合适的原因。
我可以用嵌套循环来做到这一点 - 但它需要永远。
我想到了使用字典词典。
我可以提前告诉所有可能的值,所以我从一个空值的字典开始——我想迭代地添加它们。

如果这是第一次迭代的输入

l1 = ['1','2']
l2 = ["A", "B"]

我希望得到:

{'1':{'A': [1, 0], 
      'B': [1, 0]}
 '2':{'A': [1, 0], 
      'B': [1, 0]},
 '3': {},
 '4': {},
 '5': {}}
 }

并在第二次迭代后:

l1 = ['1','3','5']
l2 = ['B','C']]

我希望得到:

{'1':{'A': [1, 0], 
      'B': [2, 0],
      'C': [1, 0]}
 '2':{'A': [1, 0], 
      'B': [1, 0]}
 '3':{'B': [1, 0], 
      'C': [1, 0]},
 '4':{},
 '5':{'B': [1, 0], 
      'C': [1, 0]}
 }

最有效的方法是什么?

标签: python-3.xdictionary

解决方案


如果您的列表很大,那么我建议使用链表稀疏矩阵。

尝试这个!

l1_superset = ['1','2','3','4','5']
l2_superset = ['A','B','C','D','E']

M=sparse.lil_matrix(np.zeros((len(l1_superset),len(l2_superset))))

mapper_l1 = {k:idx for idx,k in enumerate(l1_superset)}
mapper_l2 = {k:idx for idx,k in enumerate(l2_superset)}

def update (l1,l2):
    for i in l1:
        for j in l2:
            M[mapper_l1[i],mapper_l2[j]] = M[mapper_l1[i],mapper_l2[j]] + 1

l1 = ['1','2']
l2 = ["A", "B"]
update(l1,l2)

l1 = ['1','3','5']
l2 = ['B','C']
update(l1,l2)

推荐阅读