【问题标题】:iterating over shared keys in two dictionaries遍历两个字典中的共享键
【发布时间】:2015-03-19 07:16:14
【问题描述】:

我有两个字典。他们共享一些密钥。我想遍历那些共享密钥。以下是三种方法。

x={1:'a', 2:'b', 3:'c'}
y={2:'beta', 3:'gamma', 4:'delta'}

for n in (key for key in x if key in y):
    print(n)

for n in x:
    if n in y:
        print(n)

for n in x:
    if n not in y:
        continue
    print(n)

第一个看起来以后会很难读。

第二个在循环中有很多缩进。

第三个使用continue,我发现它使代码更难遵循。

我应该使用什么标准?它是这三个之一吗?

【问题讨论】:

    标签: python


    【解决方案1】:

    最佳方法取决于您使用的 Python 版本。它们都涉及使用& 运算符来设置交集。

    • 3.0+ dict.keys() 方法
    • 2.7+ dict.viewkeys() 接近
    • 2.3+ set 接近

    dict.keys() -- 3.0+

    在 Python 3 中,dict.keys() 返回一个覆盖 & 运算符 [1] 的 dict_keys 对象:

    x={1:'a', 2:'b', 3:'c'}
    y={2:'beta', 3:'gamma', 4:'delta'}
    
    for k in x.keys() & y.keys():
        print(k, x[k], y[k])
    

    输出:

    2b 测试版 3 c伽马

    但在 Python 2 中,这会给你一个TypeError

    回溯(最近一次通话最后): 对于 x.keys() 和 y.keys() 中的 k: 类型错误:& 不支持的操作数类型:“列表”和“列表”

    dict.viewkeys() -- 2.7+

    不过,别担心!此功能在 2.7 中被反向移植到 Python,但使用了不同的名称(以免破坏现有代码)dict.viewkeys()

    for k in x.viewkeys() & y.viewkeys():
        print k, x[k], y[k]
    

    (相同的输出)

    带套 -- 2.3+

    从 2.3 开始,您可以使用 sets 和交集 (&) 运算符。

    s & t:s 和 t 共有元素的新集合

    例如:

    for k in set(x) & set(y):
        print k, x[k], y[k]
    

    (相同的输出)

    但是,在这里,您复制了键占用的空间(一次在字典中,用作键,然后再次在完全独立的 set 中)

    [1]PEP-3106 Revamping dict.keys(), .values() and .items()

    【讨论】:

    • Python 2 有dict.viewkeys()。在那里使用set() 也是多余的。如果您确实需要使用set(),请直接在字典上使用,因此set(x) & set(y),无需创建额外的列表/字典视图对象。跨度>
    • @MartijnPieters 这是关于 2.7 反向移植和密钥的一个好点,我会相应地更新。
    【解决方案2】:

    如果你想避免缩进(虽然,真的,它看起来并不多)并且想要比第一个更清晰的东西,你可以使用一个集合交集:

    for k in x.keys() & y.keys():
        print k
    

    & 是交集运算符,确保您仅迭代共享键。如果您想迭代所有键,请使用 x.keys() | y.keys()

    【讨论】:

    • 啊!当然,我又一次错过了 python 2 vs 3 的区别。使用 python3 的另一个好理由。
    猜你喜欢
    • 1970-01-01
    • 2014-05-15
    • 1970-01-01
    • 2021-11-23
    • 2016-06-20
    • 1970-01-01
    • 2022-01-14
    • 1970-01-01
    • 2015-03-28
    相关资源
    最近更新 更多