我有一个字典,其中包含不同数量项目的值列表。 我想将这个字典(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]
答案 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()用于使键查找更快。