итерация по общим ключам в двух словарях

У меня два диктата. У них есть несколько ключей. Я хотел бы перебирать эти общие ключи. Вот три способа сделать это.

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 вы используете. Все они связаны с использованием оператора & для заданного пересечения.

  • dict.keys()
  • 2.7+ dict.viewkeys() подход
  • 2.3+ set подход

dict.keys () – 3.0+

В Python 3, dict.keys() возвращает объект dict_keys который переопределяет & operator [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 б бета
 3 c гамма

Но в Python 2 это даст вам TypeError :

 Traceback (последний последний вызов):
     для k в x.keys () & y.keys ():
 TypeError: неподдерживаемый тип операндов для &: 'list' и 'list'

dict.viewkeys () – 2.7+

Не волнуйся, однако! Эта функциональность была включена в Python в версии 2.7, но под другим именем (чтобы не сломать существующий код), 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 ​​() и .items ()

Если вы хотите избежать отступов (хотя, на самом деле, это не похоже на много) и хотите что-то более четкое, чем первое, вы можете использовать набор пересечений:

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

& является оператором пересечения, убедившись, что вы перебираете только общие ключи. Если вы хотите итерации по всем клавишам, используйте x.keys () | y.keys ()