2

我有一本字典,其中包含不同数量的项目的值列表。我想将此字典 (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 for k in dict2 if k in dict]

4

2 回答 2

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_valuetry 下的第一条语句失败,导致catch块无害pass

于 2013-10-27T04:31:59.070 回答
2

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

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

它返回 dict1 中作为 dict2 中的键的每个值的键、dict1 的值和 dic2 的值。可以对其进行编辑以返回字符串等...

这输出:

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

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

于 2013-10-27T04:39:09.183 回答