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

#python #python-3.x

#python #python-3.x

Вопрос:

Я знаю, что функция map получает функцию в качестве своего первого аргумента, а следующие аргументы — это итераторы, к которым необходимо применить переданную функцию. Мой вопрос здесь в том, есть ли у меня 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))
 

x = мощность, до которой должен быть поднят список

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

Комментарии:

1. Я полагаю, что вам следует отдать предпочтение вашему решению с использованием лямбда-выражения.

Ответ №1:

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

 import functools

new_list = list(map(functools.partial(sorted, reverse=True), l))
 

Комментарии:

1. Я собирался опубликовать это, потому что это правильный путь. Но вместо этого написал другой вариант, потому что вы были первым 😉

2. functools.partial это способ python для выполнения функций.

3. @TheNamesAlc Да, именно так это и работает, вы можете прочитать больше из документации: docs.python.org/3/library/functools.html#functools.partial

Ответ №2:

Вы можете использовать a lambda для переноса функции:

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

или:

 map(lambda i, j: pow(i, j), list,itertools.repeat(x))
 

Комментарии:

1. Это то, что позволяет вам делать lambda.

Ответ №3:

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

Вы могли бы использовать 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)
 

Комментарии:

1. Вы правы. 2 и 3 технически одинаковы. Они оба лениво оцениваются. Насколько я знаю, единственное отличие заключается в синтаксисе. Я предпочитаю третий, потому что для меня его легче понять.

Ответ №4:

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

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]]