Python相当于字典的zip

Eri*_*ric 31 python dictionary iterator

如果我有这两个列表:

la = [1, 2, 3]
lb = [4, 5, 6]
Run Code Online (Sandbox Code Playgroud)

我可以按如下方式迭代它们:

for i in range(min(len(la), len(lb))):
    print la[i], lb[i]
Run Code Online (Sandbox Code Playgroud)

或者更诡异

for a, b in zip(la, lb):
    print a, b
Run Code Online (Sandbox Code Playgroud)

如果我有两本词典怎么办?

da = {'a': 1, 'b': 2, 'c': 3}
db = {'a': 4, 'b': 5, 'c': 6}
Run Code Online (Sandbox Code Playgroud)

再次,我可以手动迭代:

for key in set(da.keys()) & set(db.keys()):
    print key, da[key], db[key]
Run Code Online (Sandbox Code Playgroud)

是否有一些内置方法允许我迭代如下?

for key, value_a, value_b in common_entries(da, db):
    print key, value_a, value_b 
Run Code Online (Sandbox Code Playgroud)

Vol*_*ity 32

没有可以执行此操作的内置函数或方法.但是,您可以轻松定义自己的.

def common_entries(*dcts):
    for i in set(dcts[0]).intersection(*dcts[1:]):
        yield (i,) + tuple(d[i] for d in dcts)
Run Code Online (Sandbox Code Playgroud)

这基于您提供的"手动方法",但是zip,可以用于任何数量的词典.

>>> da = {'a': 1, 'b': 2, 'c': 3}
>>> db = {'a': 4, 'b': 5, 'c': 6}
>>> list(common_entries(da, db))
[('c', 3, 6), ('b', 2, 5), ('a', 1, 4)]
Run Code Online (Sandbox Code Playgroud)

当只提供一个字典作为参数时,它基本上返回dct.items().

>>> list(common_entries(da))
[('c', 3), ('b', 2), ('a', 1)]
Run Code Online (Sandbox Code Playgroud)

  • [Change1:] 另外,坚持`zip(*seq)-->seq` 契约,我建议返回`key, (values, tuple, ...)` 以模仿字典。[Change2:] 最后一个更好的名字是`zipdic(*map)-->map`。 (2认同)

Kor*_*eth 9

您可能希望使用Python Set类型创建交集.

da = {'a': 1, 'b': 2, 'c': 3, 'e': 7}
db = {'a': 4, 'b': 5, 'c': 6, 'd': 9}

dc = set(da) & set(db)

for i in dc:
  print i,da[i],db[i]
Run Code Online (Sandbox Code Playgroud)

干杯,

K.

  • 除了它确实避免使用值得+1的`.keys()` (5认同)
  • 这基本上就是OP的手动方法所做的. (4认同)

pyl*_*ang 6

字典键视图已经在 Python 3 中类似设置。您可以删除set()

for key in da.keys() & db.keys():
    print(key, da[key], db[key])
Run Code Online (Sandbox Code Playgroud)

在 Python 2 中:

for key in da.viewkeys() & db.viewkeys():
    print key, da[key], db[key]
Run Code Online (Sandbox Code Playgroud)