我有两个词。他们分享一些钥匙。我想迭代这些共享密钥。这有三种方法。
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
我发现使代码更难以遵循。
我应该使用什么标准?它是这三个中的一个吗?
答案 0 :(得分:5)
最佳方法取决于您使用的Python版本。它们都涉及使用&
运算符进行集合交集。
dict.keys()
方法dict.viewkeys()
方法set
方法dict.keys() - 3.0 +
在Python 3中,dict.keys()
返回一个dict_keys
对象,该对象覆盖&运算符[1]:
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])
输出:
2 b beta 3 c gamma
但在Python 2中,这将为您提供TypeError
:
Traceback (most recent call last): for k in x.keys() & y.keys(): TypeError: unsupported operand type(s) for &: 'list' and 'list'
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 :(得分:1)
如果你想避免缩进(虽然,实际上,它看起来并不多)并且想要比第一个更清晰的东西,你可以使用一个集合交叉点:
for k in x.keys() & y.keys():
print k
&安培;是交集运算符,确保仅迭代共享密钥。如果要迭代所有键,请使用x.keys()| y.keys()