繁体   English   中英

python庞大的字典比较

[英]python huge dictionary comparison

我有两个字典和一个列表如下

list1 =[['3', {'3': ['4'], '10': ['2'], '9': ['8'], '11': ['8']}],
    ['8', {'7': ['8'], '6': ['9'], '3': ['1']}],
    ['7', {'5': ['11'], '10': ['6'], '2': ['3']}],
    ['9', {'4': ['1']}]
    ]
list2 ={0: -2.829363315837061, 1: -3.483150971596311, 2: -3.55866903680906, 3: -3.644673448138691, 4: -3.78, 5: -3.9343704669124677, 6: -4.1158785480167435, 7: -4.074895059134982, 8: -4.397225116848732, 9: -4.425674125747298, 10: -4.416164011466592, 11: -4.906491662382141}

list3 ={0: -2.865996006819783, 1: -3.6503055799900492, 2: -3.58670223884185, 3: -3.73129019873609, 4: -3.73, 5: -4.049442571308586, 6: -4.086222130931718, 7: -4.19022476024935, 8: -4.243919389901362, 9: -4.246976004644184, 10: -4.334028831306514, 11: -4.678255063114617}

如果键相同,我试图从两个字典(list2 和 list3)中获取与键关联的值,如果键相同,然后将与列表一具有相同键的 list2 的值与值相乘list1 并为 list1 中的每个字典列表添加这些值。 与列表 3 相同。

for index in range(len(list1)):
tot_pos_probability = 0
tot_neg_probability =0
    for the_key, the_value in list1[index][1].items():
        for item in list2.keys():
            if int(the_key) == item:
                tot_pos_probability += int(the_value[0])*list2.get(item)
        for elem in list3.keys():
            if int(the_key) == elem:
                tot_neg_probability += int(the_value[0])*list3.get(elem)

上面的代码完全正常工作,并为我提供了上面列表和字典示例的预期结果。

但我原来的 list1 大小约为 15000,list1 中的每个字典包含大约 200-400 个键值对。同样,两个字典 list2 和 list3 也包含大约 10000 个唯一键值对。在这种情况下,上面的代码工作得非常糟糕。我我无法得到任何结果。它持续运行了 10 分钟,但没有结果。您能否帮我提供一个在这种情况下非常有效的优化解决方案。

您不需要内部for循环,在这些循环中,您只需检查the_key是否是 list2 或list3的键,然后使用您的公式计算tot_pos_probabilitytot_neg_probability 您可以改为使用默认值为0 .get() ,这样如果key不存在,它就不会改变概率。 例子 -

for list1elem in list1:
    tot_pos_probability = 0
    tot_neg_probability =0
    for the_key, the_value in list1elem[1].items():
        tot_pos_probability += int(the_value[0])*list2.get(int(the_key), 0)
        tot_neg_probability += int(the_value[0])*list3.get(int(the_key), 0)

我看到以下方法有相当大的性能改进。 它可能会帮助你:)

       for each in list1:
            mykeys = each[1].keys()
            mylist = map(int,mykeys)
            common1 = set(mylist) & set(list2)
            common2 = set(mylist) & set(list3)
            if common1:
                tot_pos_probability = map(lambda ele: int(each[1][str(ele)][0])*list2[ele], common1)
                print sum(tot_pos_probability)
            if common2:
                tot_neg_probability = map(lambda ele: int(each[1][str(ele)][0])*list2[ele], common2)
                print sum(tot_neg_probability)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM