通过两个词典进行迭代

时间:2016-02-04 22:15:40

标签: 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,5,3]],
          'H3':[[2,3,4],
                [2,1,4],
                [0,1,2]]}

我试图遍历dict_1中键的值中的项目,并检查这些项目中是否有任何项目位于dict_2中相应键的值中的任何项目中。然后打印值,以及在dict_2的键中找到它的索引。

因此,例如,因为密钥列表中的0< H1'在密钥“H1”的任何列表中都找不到dict_1。在字典2中,什么都不打印。现在,如果我们检查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'已检查的密钥,02表示{{1}列表在dict_2中找到了

这就是我所拥有的:

1

但是我想知道这是否会照顾一切,或者是否会打印重复的项目?

2 个答案:

答案 0 :(得分:2)

这应该有效:

{{1}}

迭代所有键,列表和d1。然后在d1_list中的元素上,最后检查它是否是dict_2中与同一个键对应的任何列表。

答案 1 :(得分:0)

首先回答一些问题:是的,您的代码将会#34;照顾好所有事情",并且不会打印重复的项目"意思是如果一个值在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_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格式的附加灵活性和灵活性完全相同。

希望这有帮助。