将一个字典的键与具有值列表的另一个字典进行比较

时间:2013-10-27 04:00:42

标签: python list dictionary list-comprehension

我有一个字典,其中包含不同数量项目的值列表。 我想将这个字典(dict1)的值与另一个字典(dict2)的键进行比较,如果它们匹配,则打印dict1的匹配组件的键和值,以及dict2的值。 这两个字典都很大,目前这个时间太长了,你可以从这个基本脚本中猜到。

dict1 = {boys:[tom,jon],girls:[suzy]}

dict2 = {suzy:paper-stapler-extraordinaire,jon:paper-shredderoligist,tom:garbage-specialist}

输出:

    boys \t tom \t garbage-specialist

    boys \t jon \t paper-shredderoligist  etc.....

for k,v in dict2.items():

    for key,value in dict1.items():
         if k in value[0]:
             print str(key)+"\t"+str(value[0])+"\t"+v
         if len(value)>1:
             if k in value[1]:
                 print str(key)+"\t"+str(value[0])+"\t"+v

有人可以提出更有效的内存方法吗?也许列表理解? 这还没有奏效...... a = [如果k在dict中,则k为dict2中的k]

2 个答案:

答案 0 :(得分:2)

for dict1_key, dict1_values in dict1.iteritems():
    for dict1_value in dict1_values:
        try:
            dict2_value = dict2[dict1_value]
            print str(dict1_key) + '\t' + str(dict1_value) + '\t' + str(dict2_value)
        except KeyError:
            pass

它结合了一些技术来加速它并减少使用内存。 iteritems使用较少的内存(正如其他人提到的那样)。通过使用try然后使用dict2[dict1_value],您可以确保dict2仅搜索一次,然后使用哈希算法,这应该比迭代所有元素快得多。对于dict2中没有dict1_value的所有情况,try下的第一个语句都会失败,导致catch块无害pass

答案 1 :(得分:2)

您是否正在寻找以下内容:

[(k,i,dict2[i]) for k,v in dict1.items() for i in v if i in set(dict2.keys())]

返回dict1中的每个值的dict1的值,dict1的值和dic2的值,这是dict2中的一个键。这可以编辑为返回字符串等...

输出:

[('boys', 'tom', 'garbage-specialist'),
 ('boys', 'jon', 'paper-shredderoligist'),
 ('girls', 'suzy', 'paper-stapler-extraordinaire')]

dict2.keys()上的set()用于使键查找更快。