Словарное сравнение с кортежем в качестве значений - PullRequest
0 голосов
/ 06 июня 2019

Я создаю простое словарное сравнение для поиска и сопоставления элементов. В этих основных формах он работает как положено.

def findOrders(lst, **kwargs):
    return [k for k in lst if kwargs.items() <= k.items()]

lst = [i for i in [ {'type':'esimene', 'id':1},
                    {'type':'teine', 'id':2},
                    {'type':'kolmas', 'id':3}]]

print(findOrders(lst, type='esimene'))

Теперь я хотел бы сравнить / сопоставить по нескольким «типам», используя кортеж в качестве ключевого слова / значений:

findOrders(lst, type=('esimene', 'teine'))

Как лучше всего это сделать?

Могу ли я создать генератор, который выравнивает кортеж до 'type': 'esimene' и 'type': 'teine' и затем запускает сравнение? Как бы это выглядело?

Эффективность также важна для этой функции.

1 Ответ

2 голосов
/ 06 июня 2019

Вы можете проверить, содержит ли параметр type свойство type каждого элемента:

In [8]: def findOrders(lst, **kwargs):
   ...:     return [k for k in lst if k["type"] in kwargs["type"]]

In [9]: print(findOrders(lst, type='esimene'))
[{'type': 'esimene', 'id': 1}]

In [10]: print(findOrders(lst, type=('esimene',  'teine')))
[{'type': 'esimene', 'id': 1}, {'type': 'teine', 'id': 2}]

Если вы также хотите сохранить текущую логику со сравнением id:

In [32]: def findOrders(lst, **kwargs):
    ...:     return [k for k in lst if k["type"] in kwargs.get("type", (k["type"], )) and k["id"] ==
    ...: kwargs.get("id", k["id"])]
    ...:
    ...:
    ...:

In [33]: print(findOrders(lst, id=1))
[{'type': 'esimene', 'id': 1}]

In [34]: print(findOrders(lst, type=('esimene',  'teine')))
[{'type': 'esimene', 'id': 1}, {'type': 'teine', 'id': 2}]

In [35]: print(findOrders(lst, type=('esimene', 'teine'), id=2))
[{'type': 'teine', 'id': 2}]
...