Как передать аргументы функции при вызове функции «map»?

1

Я знаю, что функция карты получает функцию в качестве первого аргумента, а следующие аргументы являются итераторами, к которым необходимо применить переданную функцию. Мой вопрос здесь сказать, если у меня есть 2d список, как это

l=[[1,2,3],[4,5,6],[7,8,9]]

как я могу отсортировать отдельные списки в обратном порядке, чтобы мой вывод

l=[[3,2,1],[6,5,4],[9,8,7]]

Я знаю, что потенциальное решение использует лямбда-функцию, такую как

list(map(lambda x:x[::-1],l))

Я хочу что то подобное

list(map(sorted, l,'reversed=True'))

где 'reversed = True' - это аргумент, который сортируется

например:

>>> newList=[1,2,3]
>>> sorted(newList,reversed='True')
>>> [3,2,1]

Я видел, как передать аргументы функции pow с помощью модуля itertools.repeat

map(pow,list,itertools.repeat(x))

х = сила, к которой должен быть поднят список

Я хочу знать, есть ли способ передать аргументы в функции карты. В моем случае 'reverse = True' для отсортированной функции.

  • 0
    Я полагаю, что ваше решение с использованием лямбды - это то, что вам следует отдать предпочтение.
Теги:
python-3.x

4 ответа

0
Лучший ответ

Есть много способов сделать это.

Вы можете использовать functools.partial. Это создает partial, из- за отсутствия лучшего слова, функции вы передаете к нему. Это своего рода создает новую функцию с некоторыми параметрами, уже переданными в нее.

Для вашего примера это будет:

from functools import partial
rev_sort = partial(sorted, reverse=True)
map(rev_sort, l)

Другой способ - использовать простую лямбду:

map(lambda arr: sorted(arr, reverse=True), l)

Другой способ (мой личный выбор) использует генераторы:

(sorted(arr, reverse=True) for arr in l)
  • 0
    спасибо за объяснение, также не 2 и 3 то же самое ?? Я имею в виду, что map также возвращает итератор, если явно не конвертировано, и ваше второе решение делает это, третье делает то же самое, и я верю, что все выполняются лениво, не так ли? Я могу ошибаться, я только учусь об итераторах и генераторах.
  • 0
    Ты прав. 2 и 3 технически одинаковы. Они оба лениво оценены. Насколько я знаю, разница только в синтаксисе. Я предпочитаю третий, потому что для меня это легче понять.
2

Вы можете использовать lambda чтобы обернуть функцию:

map(lambda x: sorted(x, reversed=True), l)

или же:

map(lambda i, j: pow(i, j), list,itertools.repeat(x))
  • 0
    Я знаю, что можно использовать лямбду, я хочу, чтобы она применялась для любых функций, которые принимают аргументы, например, моя собственная функция, которая принимает строки в качестве аргумента и выполняет на основе переданной ей строки
  • 2
    Именно это позволяет вам делать лямбда.
2

Вы можете использовать functools.partial для этого:

import functools

new_list = list(map(functools.partial(sorted, reverse=True), l)
  • 0
    не могли бы вы объяснить, как это работает, я не видел, чтобы этот модуль использовался / ссылался так много
  • 0
    Я собирался опубликовать это, потому что это путь. Но вместо этого написал другой вариант, потому что ты был первым;)
Показать ещё 3 комментария
0

Для этого конкретного случая вы также можете использовать понимание списка -

l=[[1,2,3],[4,5,6],[7,8,9]]

l = [list(reversed(sublist)) for sublist in l]//[[3,2,1], [6,5,4], [9,8,7]]

Ещё вопросы

Сообщество Overcoder
Наверх
Меню