Что такое Python-эквивалент JavaScript-массива Array.prototype.find? - PullRequest
0 голосов
/ 04 июля 2018

Я ищу что-то вроде: find(pred, iter) в Python

obj = { 
         "foo_list": [ 
           {"name": "aaaa", "id": 111},
           {"name": "bbbb", "id": 222},
           {"name": "cccc", "id": 333}
         ]
}

Как: find(lambda x: x.get("name") == "bbbb", obj.get("foo_list", []))

Ответы [ 2 ]

0 голосов
/ 04 июля 2018
def find(pred, iterable):
  for element in iterable:
      if pred(element):
          return element
  return None

# usage:
find(lambda x: x.get("name") == "bbbb", obj.get("foo_list", []))
0 голосов
/ 04 июля 2018

Array.prototype.find() возвращает первый соответствующий элемент в массиве с заданной функцией предиката или undefined, когда совпадения нет.

Python имеет функцию filter() , которая фильтрует итерируемое по предикату, и next(), который создает первый элемент итерируемого или необязательное значение по умолчанию. Сочетая их, вы получите эквивалент:

next(filter(pred, iter), None)

где pred - это вызываемый объект, который возвращает True, когда элемент соответствует критериям поиска.

Демо-версия:

>>> iterable = [42, 81, 117]
>>> parity_odd = lambda v: v % 2 == 1
>>> next(filter(parity_odd, iterable), None)
81
>>> iterable = [42, 2, 4]
>>> next(filter(parity_odd, iterable), None) is None
True

Если вы удалите второй аргумент для next(), исключение StopIteration будет вызвано, если нет соответствующего элемента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...