Python __ror__ и другие двоичные методы для элементов dict?

#python-3.x #dictionary #binary

#python-3.x #словарь #двоичный

Вопрос:

Учитывая:

 >>> di1={'a':1,'b':2, 'c':3}
  

Если я сделаю:

 >>> dir(di1.items())
['__and__', '__class__', '__contains__', '__delattr__', 
 '__dir__', '__doc__', '__eq__', '__format__', '__ge__', 
 '__getattribute__', '__gt__', '__hash__', '__init__',    
 '__init_subclass__', '__iter__', '__le__', '__len__', '__lt__',   
 '__ne__', '__new__', '__or__', '__rand__', '__reduce__',  
 '__reduce_ex__', '__repr__', '__reversed__', '__ror__', 
 '__rsub__', '__rxor__', '__setattr__', '__sizeof__', 
 '__str__', '__sub__', '__subclasshook__',
'__xor__', 'isdisjoint']
  

Там есть несколько интересных методов.

Попробуйте __ror__ :

 >>> help(di1.items())
...
 |  __ror__(self, value, /)
 |      Return value|self.
...
  

Где value является только итерацией в соответствии с ошибками Python.

Давайте попробуем несколько примеров:

 >>> di1.items().__ror__([1])
{('c', 3), 1, ('b', 2), ('a', 1)}
>>> di1.items().__ror__([10])
{('c', 3), ('b', 2), 10, ('a', 1)}
>>> di1.items().__ror__([1000])
{1000, ('b', 2), ('c', 3), ('a', 1)}
>>> di1.items().__ror__([10,1000])
{('c', 3), ('a', 1), 1000, 10, ('b', 2)}
  

Заголовок

Каковы варианты использования двоичного or представления dict с возможностью взаимодействия? (или другие двоичные методы там, __rxor__ , __rand__ также …)

Ответ №1:

Немного поцарапав, я обнаружил, что то, на что я смотрел, является одним из элементов операций набора представления dict, которые включают операции набора .items() .

Учитывая:

 >>> di1={'a': 1, 'b': 2, 'c': 3}
>>> di2={'a': 1, 'b': 3, 'c': 4, 'd':47, 'e':0}
  

Примеры:

 >>> di1.items() amp; di2.items()
{('a', 1)}
# Only 'a' because with .items both key and value must be the same
# equivalent to:
# set(di1.items()) amp; set(di2.items())
# However: values must be hashable

>>> di1.keys() amp; ['a','d']
{'a'}
# only keys compared to a list
# equivalent to set(di1.keys()) amp; set(['a', 'd'])

# carefule tho: 
# (di1.keys() | di2.keys()) amp; set(['a', 'e']) is right
# di1.keys() | di2.keys() amp; set(['a', 'e']) is WRONG
# since amp; is higher precedence than |


>>> di1.keys() amp; 'zycd'
{'c'}
# and string
# equivalent to  set(di1.keys()) amp; set('zycd')

>>> di1.keys() | di2.keys()
{'b', 'a', 'd', 'e', 'c'}
# all the keys in both dicts -- since sets are used, not 
# necessarily in order

>>> di2.keys() - di1.keys()
{'d', 'e'}
# keys exclusively in di2
  

Это полезно!