2013-10-27 344 views
1

我有一个包含不同数量项目值的列表的字典。 我想比较这个词典(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 = [在dict2 k代表k如果K的字典]

+0

如果您使用Python 2.x,请使用'iteritems'而不是'items'。 – falsetru

+0

速度真的会有所作为吗? – Vince

+0

['dict.items'](http://docs.python.org/2/library/stdtypes#dict.items)将项目作为列表复制,而['dict.iteritems'](http:// docs .python.org/2/library/stdtypes#dict.iteritems)返回一个迭代器; 'dict.iteritems'更具记忆效率。 – falsetru

回答

1
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的所有情况,尝试下的第一条语句失败,导致catch块无害化pass

+0

你的意思是“except”而不是“catch”? 这似乎很容易,但它从不打印任何东西。这真的是条件陈述:“dict2_value = dict2 [dict1_value]”?即使我删除了try和catch之间的所有内容,并且只打印了dict2_value,也没有任何东西会打印 – Vince

+0

@Vince是的,它应该是'except'。尝试下的第一行是为了分配,而不是条件语句。如果'dict2'缺少'dict1_value'键,该分配会导致错误,这会导致'try'块结束并且'except'块接管。随着“except”的变化,然后输入“dict1”和“dict2”,完全按照上面的问题,我得到了三行输出(每个人在一个字符之间共享一行),包括'girls \ tsuzy \ tpaper-订书机extraordinaire'。 –

+0

嗯。所以我的字典与上面的格式完全相同,除了不同的项目。此代码不适用于他们。但是当我像上面这样使用dict1和dict2时,这个工作。它们是如何创建的?具体来说,如果我以下面的方式创建了字典,然后使用上面的代码,以这种方式指定值,它不起作用。有什么不同? \ n dict2 [uid] = [] \ n dict2 [uid] .append(object) – Vince

2

您是否在寻找沿着线的东西:

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

返回键,dict1和DIC2的价值的价值在dict1每个值是在dict2的关键。这可以被编辑以返回一个字符串,等等

此输出:

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

集()上dict2.keys()是用来做主要的查找速度更快。

+0

我不断收到TypeError:不可用类型:使用此 – Vince

+0

时出现'列表'错误我不知道如何解决这个问题。我认为这是价值清单的问题,这就是为什么我最初问这个问题的原因。根据我的理解,这个声明流程如下: 1)对于k,v in dict2 [v],对于k,v在dict1.items中,如果值在set dict2中,则打印任何内容。如果我删除了设置的部分,错误消失了,但它打印出一个空的列表。该集合完成了什么?谢谢。 – Vince

+0

该设置允许快速查找以查看值是否在键中。不幸的是,我最初查找的值是一个列表,列表是不可散列的(相反,您需要使用一个元组)。我已经改变了答案,以查找列表中的每个单独的值。 – RMcG

相关问题