Je sais qu'une fonction de carte obtient une fonction comme premier argument et les arguments suivants sont des itérateurs sur lesquels la fonction passée doit être appliquée. Ma question ici est de dire si j'ai une liste 2D comme celle-ci
map(pow,list,itertools.repeat(x))
comment puis-je trier les listes individuelles dans l'ordre inverse pour que ma sortie soit
>>> newList=[1,2,3] >>> sorted(newList,reversed='True') >>> [3,2,1]
Je sais qu'une solution potentielle utilise une fonction lambda telle que
list(map(sorted, l,'reversed=True'))
Je veux quelque chose comme ça
list(map(lambda x:x[::-1],l))
où 'reverse = True' est un argument qui trie prend
par exemple:
l=[[3,2,1],[6,5,4],[9,8,7]]
J'ai vu comment passer des arguments à une fonction pow en utilisant le module itertools.repeat
l=[[1,2,3],[4,5,6],[7,8,9]]
x = puissance à laquelle la liste doit être élevée
Je veux savoir s'il existe un moyen de passer les arguments dans une fonction de carte. Dans mon cas, le 'reverse = True' pour la fonction triée.
4 Réponses :
Vous pouvez utiliser functools.partial pour cela:
import functools new_list = list(map(functools.partial(sorted, reverse=True), l))
J'allais publier ça parce que c'est la voie à suivre. Mais a écrit l'autre option à la place parce que vous étiez le premier;)
functools.partial est le moyen python pour curry des fonctions.
@TheNamesAlc Oui, c'est exactement comme ça que cela fonctionne, vous pouvez en savoir plus dans la documentation: docs.python.org/3/library/functools.html#functools.partial
Vous pouvez utiliser un lambda pour envelopper la fonction:
map(lambda i, j: pow(i, j), list,itertools.repeat(x))
ou:
map(lambda x: sorted(x, reversed=True), l)
C'est ce que lambda vous permet de faire.
Pour ce cas précis, vous pouvez également utiliser une compréhension de liste -
l=[[1, 2, 3, 4, 5, 6, 7, 8, 9, ,
l = [liste (inversée (sous-liste)) pour la sous-liste dans l]
// [[3,2,1], [6,5,4], [9,8,7]]
Il y a plusieurs façons de le faire.
Vous pouvez utiliser functools.partial . Il crée un partiel , faute de meilleur mot, de la fonction que vous lui passez. Cela crée en quelque sorte une nouvelle fonction avec des paramètres déjà passés.
Pour votre exemple, ce serait:
(sorted(arr, reverse=True) for arr in l)
L'autre façon est d'utiliser un simple lambda:
map(lambda arr: sorted(arr, reverse=True), l)
L'autre moyen (mon choix personnel), consiste à utiliser des générateurs:
from functools import partial rev_sort = partial(sorted, reverse=True) map(rev_sort, l)
Vous avez raison. 2 et 3 sont techniquement identiques. Ils sont tous deux évalués paresseusement. La seule différence est la syntaxe, pour autant que je sache. Je préfère le troisième car, pour moi, c'est plus facile à comprendre.
Votre solution utilisant un lambda est, je crois, celle que vous devriez privilégier.