10
votes

Comment transmettre plusieurs arguments à la méthode 'Key' de tri ()?

sur un site Web, j'essaie de trier une liste de magasins par leur position relative de l'utilisateur. Laissez-moi vous expliquer.

Un magasin ressemble à ceci comme suit: p> xxx pré>

i Obtenez la position de l'utilisateur dans la session. P>

def distance_of_the_shop(shop):
    # compute the distance between the shop and the user and return it
    return computed_distance

sorted(shop_list, key=distance_of_the_shop)


1 commentaires

Voulez-vous dire: «Comment puis-je transmettre l'emplacement de l'utilisateur vers Distang_of_the_shop aussi"?


3 Réponses :


20
votes

Il suffit de envelopper l'appel dans une Lambda: xxx

et ajoutez deux autres arguments à la distance_of_the_shop () fonction pour recevoir la longitude et la latitude.

Le Trié () Appelle la fonction pour chaque valeur dans shop_list , mais rien n'indique que l'appelable ne peut pas appeler d'autres fonctions. Un lambda est le moyen le plus simple de créer une nouvelle fonction wrapper qui fait exactement cela.

Vous pouvez également utiliser un functools.partiale () objet , à condition que les valeurs de longitude et latitude puissent être transmises sous forme d'arguments de mots clés , ou accepte ces deux valeurs comme les deux premiers arguments de position. Les traiter comme des arguments de mots clés est probablement préférable, même s'ils reçoivent une position (pas de valeur par défaut), vous pouvez utiliser leurs noms comme arguments de mots clés dans le partial () .

En supposant que la définition est la suivante: xxx

puis utilisez xxx

et trié () passera chaque magasin vers le partial () , qui à tour appelle distance_of_the_shop (magasin, long = ulong, lat = ulat) < / p>


2 commentaires

Est-il strictement nécessaire que les éléments de la séquence d'entrée (ici: shop_list ) sont entrés dans le premier argument, en particulier lorsque vous utilisez kwargs ? J'essaie d'utiliser kwargs dans ma définition partielle: partiel (distance_of_the_shop, shop = "foo", long = "bar") puis trier sur le manquant> Lat argument, mais je reçois l'erreur: a eu plusieurs valeurs pour argument 'Shop' . La documentation indique que les arguments supplémentaires sont annexés à * args , c'est pourquoi je m'attendais à ce que mon code fonctionne. Qu'est-ce que je contrôle?


@ N1K31T4 Les arguments de position sont liés en premier. Donc, toutes les valeurs dans * args sont attribuées à Boutique , puis long , puis lat . Donc, vous vous retrouvez avec une autre valeur pour Boutique des arguments de mots clés. Les arguments de position ne peuvent pas être utilisés pour remplir les paramètres sans mot-clé argument.



1
votes

Votre question est difficile à comprendre car vous ne définissez jamais une fonction distance et la fonction que vous fournissez, distance_of_the_shop , prend réellement un seul argument.

Si Je comprends correctement, vous souhaitez distance_of_the_shop pour recevoir l'utilisateur actuel et le magasin étant comparé. Pour atteindre cela, utilisez un lambda : xxx

Notez également qu'il n'a pas de sens d'appeler trié sans attribuer sa valeur à une variable ou du conteneur. Si vous souhaitez trier une liste mise en place, utilisez la méthode trier , comme indiqué ci-dessus.


2 commentaires

Mon mauvais, il n'y a qu'une seule fonction distance_of_the_shop


@Thom il est toujours défini pour recevoir un seul argument, cependant?



1
votes

Tout d'abord, nous avons besoin d'une fonction de distance (celle-ci calcule les distances de grand cercle): xxx

puis nous définissons une fonction de distance par utilisateur: xxx < / pré>

et appelez-le comme xxx


0 commentaires