Python 遍历两个词典
我有两本字典:Python 遍历两个词典,python,Python,我有两本字典: dict_1 = {'H1':[0,1,3,2], 'H2':[5,4,2,1,5], 'H3':[1,2,5]} dict_2 = {'H1':[[1,4,3,2], [6,5,3,2], [1,4,3,2]], 'H2':[[0,0,1,6,3], [2,1,4,2,1], [5,1,2,
dict_1 = {'H1':[0,1,3,2],
'H2':[5,4,2,1,5],
'H3':[1,2,5]}
dict_2 = {'H1':[[1,4,3,2],
[6,5,3,2],
[1,4,3,2]],
'H2':[[0,0,1,6,3],
[2,1,4,2,1],
[5,1,2,5,3]],
'H3':[[2,3,4],
[2,1,4],
[0,1,2]]}
我试图遍历dict_1中键的值中的项,并检查这些项是否在dict_2中相应键的值中的任何项中。然后打印该值以及在dict_2的键中找到该值的索引
例如,由于dict_1的键“H1”列表中的0在dict 2中的键“H1”的任何列表中都找不到,因此不会打印任何内容。现在如果我们检查1,那么
1, 'H1', 0, # because there is a one in the first list of 'H1' of dict_2
1, 'H1', 2, # because there is a one in the 3rd list of 'H1' of dict_2
此处,1
对应于已检查的项目,'H1'
对应于已检查的键,0
,2
表示在目录2中找到的1
这就是我所拥有的:
for i in range(3):
for k,v in dict_1.items():
for x,y in dict_2.items():
if k == x:
for j in v:
if j in y[i]:
print j,x,i
但我想知道这是否会解决所有问题,或者是否会打印重复的项目 这应该有效:
for key, d1_list in dict_1.iteritems():
for element in d1_list:
for ind, d2_list in enumerate(dict_2[key]):
if element in d2_list:
print element, key, ind
迭代所有键,并列出和d1。然后遍历d1_列表中的元素,最后检查它是否是dict_2中与同一个键对应的任何列表。首先给出一些答案:是的,您的代码将“处理所有事情”,并且不会“打印重复项”,这意味着如果某个值在dict_2中的同一列表中多次出现,你的代码只会发现一次 在这些dict上执行代码可以演示以下内容:
dict_1 = {'H1':[0,1,3,2]}
dict_2 = {'H1':[[0,0],
[1,2]]}
for i in range(2):
for k,v in dict_1.items():
for x,y in dict_2.items():
if k == x:
for j in v:
if j in y[i]:
print j,x,i
输出为:
0 H1 0
1 H1 1
2 H1 1
因此,在dict_2中第一个子列表中出现两次时,只发现一次0值
现在,为了完成同样的目标,我们可以简化您的代码,因为:
- 您只想比较两个dict中的相同键
- 您可能希望在dict_2中有不同大小的列表
# Loop on all key values in dict_1
for k,v in dict_1.items():
# Loop only on values in dict_2 for same key
for i,y in enumerate(dict_2[k]):
# Loop over values in first list
for j in v:
# Assert existence in second list
if j in y:
# Display result if found (note that index of subblist in dict_2 is retrieved through enumerate function
print j,x,i
这输出了完全相同的结果,同时增加了dict_2格式的清晰度和灵活性
希望这能有所帮助。“我想知道这是否会占用所有资源,或者是否会打印重复的项目”-然后。。。运行它并找出答案?你为什么问我们,而不是测试它?迄今为止提出的答案都采用线性搜索子列表的方法。因此,它们的总体时间性能将为O(N*M),其中N是
dict_1
中值的总数,M是dict_2
中子列表的平均长度。对于小型电视机,这将是好的。对于非常大的数据,特别是N,考虑使用<代码>(或)< /代码>预先计算部分答案。这将有O(N+Q)时间,其中Q将是dict_2
中子列表中的项目总数。(Q将是>>M,因此当N变大时,尤其是对于重复项,它主要是有意义的。)