如何使用一个for循环迭代2个词典?

Ben*_*enH 1 python python-2.7

我有两个数据结构,如下所示:

DATASET_0 = { 'key1': [ object1, object2, objectN ],
              'key2': [ object3, object4]
            }
DATASET_1 = { 'key1': [ object5, object6, objectN ],
              'key3': [ object7, object8],
              'key4': [ object9, object10],
            }
Run Code Online (Sandbox Code Playgroud)

(这是一个高度简化的版本,但它显示了两个顶级组件 - 基本上是列表的字典)

因此,相同的键可能会出现在两个词典中,但指向不同的对象.通常我可以动态合并两个字典并迭代合并但在这种情况下我不能这样做.我不能把顶级项目列为一个列表.

如果顶级项目是列表,我可以这样做:

for item in DATASET_0 + DATASET_1:
    blah
Run Code Online (Sandbox Code Playgroud)

无论如何使用词典做同样的事情?

mgi*_*son 6

itertools.chain 在这样的时代是一个好朋友.

from itertools import chain

d1 = {'foo': ['bar']}
d2 = {'foo': ['baz']}
for k, v in chain(d1.iteritems(), d2.iteritems()):
   print k, v
Run Code Online (Sandbox Code Playgroud)

如果你想迭代密钥,那就更容易了(并且没有修改就可以到python3.x的端口!)

for k in chain(d1, d2):
    print(k)
Run Code Online (Sandbox Code Playgroud)


Mar*_*ers 5

您可以简单地连接dict.items()列表:

for key, value in DATASET_0.items() + DATASET_1.items():
Run Code Online (Sandbox Code Playgroud)

或链接dict.iteritems()迭代(使用itertools.chain():

from itertools import chain

for key, value in chain(DATASET_0.iteritems(), DATASET_1.iteritems()):
Run Code Online (Sandbox Code Playgroud)

  • 这将有效,但您正在分配一个全新的列表.如果它们是小巧的话,这可能会很好.否则你可能想使用`itertools.chain`或其他东西. (2认同)