Как передать элементы в виде списков аргументов на карте? - PullRequest
1 голос
/ 07 декабря 2009

Это часть моего кода. Лямбда принимает 3 параметра, и я хотел передать их как набор позиционных аргументов, но, очевидно, map предоставляет их как один аргумент.

Как я могу предоставить эти кортежи внизу в виде списков аргументов? (Я знаю, что могу переписать лямбду, но она станет плохо читаемой)

 adds = map((lambda j, f, a:
      j.join([f.format(i) for i in parse.options[a]]) if parse.options[a] else ''),
      ((' ', ' -not -path "{0}" ', 'exclude'),
      (' -or ', '-path "{0}"', 'include')))

Ответы [ 4 ]

5 голосов
/ 07 декабря 2009

Описание map():

map(function, iterable, ...)

Применить функцию к каждому элементу итерации и вернуть список результатов. Если передаются дополнительные итерируемые аргументы, функция должна принимать столько аргументов и применяется к элементам из всех итерируемых параллельно . Если одна итерация короче другой, предполагается, что она расширена элементами None. Если функция None, предполагается тождественная функция; если есть несколько аргументов, map () возвращает список, состоящий из кортежей, содержащих соответствующие элементы из всех итераций (своего рода операция транспонирования). Итерируемые аргументы могут быть последовательностью или любым итерируемым объектом; Результатом всегда является список.

Вам необходимо поместить аргументы в параллельные списки или кортежи и передать их в map() как 3 итерации.

3 голосов
/ 07 декабря 2009

Альтернативой является использование itertools.starmap, который принимает предварительно сжатые аргументы:

adds = itertools.starmap((lambda j, f, a:
    j.join([f.format(i) for i in parse.options[a]]) if parse.options[a] else ''),
    ((' ', ' -not -path "{0}" ', 'exclude'),
    (' -or ', '-path "{0}"', 'include')))
3 голосов
/ 07 декабря 2009

Попробуй положить вокруг них парень

adds = map((lambda (j, f, a):
  j.join([f.format(i) for i in parse.options[a]]) if parse.options[a] else ''),
  ((' ', ' -not -path "{0}" ', 'exclude'),
  (' -or ', '-path "{0}"', 'include')))
1 голос
/ 07 декабря 2009

Один из способов - переписать в виде списка:

adds = [
  j.join([f.format(i) for i in parse.options[a]]) if parse.options[a] else ''
  for j, f, a in
  ((' ', ' -not -path "{0}" ', 'exclude'),
  (' -or ', '-path "{0}"', 'include'))]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...