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变大时,尤其是对于重复项,它主要是有意义的。)