1
votes

Je ne sais pas comment écrire une fonction de tri (à l'aide du paramètre clé) et réécrire la fonction à l'aide d'une expression Lambda

Créez une fonction appelée last_four qui prend un numéro d'identification et renvoie les quatre derniers chiffres. Par exemple, le nombre 17573005 doit renvoyer 3005. Ensuite, utilisez cette fonction pour trier la liste des identifiants stockés dans la variable, ids, du plus bas au plus élevé. Enregistrez cette liste triée dans la variable, sorted_ids. Conseil: rappelez-vous que seules les chaînes peuvent être indexées, des conversions peuvent donc être nécessaires.

La deuxième partie du problème est: "Triez les identifiants de liste par les quatre derniers chiffres de chaque identifiant. Faites-le en utilisant lambda et non fonction. Enregistrez cette liste triée dans la variable sorted_id "

J'ai défini la définition de ma fonction, et l'entrée qu'elle prend. J'ai créé une liste vide, puis j'ai créé une boucle for qui parcourt les valeurs de mon entrée, où j'ajoute les quatre derniers chiffres à la liste vide que j'ai créée. Je fais cela pour tous les éléments de mon entrée. Le je fixe la liste que j'ai créée égale à une version triée d'elle-même en utilisant la fonction triée, et j'ai la fonction renvoyant la liste triée.

Je fixe ensuite la variable sorted_ids égale à last_four avec un paramètre d'entrée spécifié .

def last_four(x):
    r = []
    for i in x:
        r.append(str(i)[-4:])

    r = sorted(r)
    print(r)
    return r

ids = [17573005, 17572342, 17579000, 17570002, 17572345, 17579329]

sorted_ids = last_four(ids)

Quand j'exécute le code ci-dessus, j'obtiens une erreur disant, "Error: TypeError: 'int' object is not iterable" puisque l'entrée est une liste d'identifiants . Après avoir lu comment résoudre cela, je pense que mon résultat est censé être quelque chose comme, " sorted_ids = sorted (ids, key = last_four) ". Lorsque j'essaie d'utiliser l'extrait de code dans la phrase précédente, j'obtiens toujours le même TypeError que je l'ai mentionné précédemment. Je ne sais pas comment l'écrire en utilisant le paramètre clé facultatif.

J'ai également besoin d'écrire la fonction en utilisant une expression Lambda sans avoir défini la fonction last_four et obtenir le même résultat, ce que je ne sais pas comment faire.

Toute indication serait apprécié.


3 commentaires

J'ai copié + collé votre code et cela a fonctionné sans modification dans Python 3.7.3 donnant une sortie de: ['0002', '2342', '2345', '3005', '9000', '9329'] < / code>. Quelle version de Python utilisez-vous actuellement?


@willk, je viens d'essayer dans repl.it, et cela fonctionne dans cet environnement. L'environnement dans lequel je fais l'exercice est dans Runestone 3.3.2 - interactivepython.org/ runestone / static / overview / overview.htm‌ l . Je ne sais pas de quelle version de Python il s'agit. Je pense que pour passer la mission, je dois utiliser le paramètre clé optionnel - "sorted_ids = sorted (ids, key = last_four)", que je n'ai pas compris comment écrire dans Runestone. J'ai également besoin de réécrire en utilisant une expression Lambda, ce que je ne sais pas comment faire. Avez-vous des idées?


Oui, je comprends ce que vous recherchez et j'ai publié ma réponse.


4 Réponses :


2
votes

Pour ce faire en utilisant trié avec une fonction lambda comme clé , vous devez spécifier ce que vous voulez faire pour chaque élément de la liste dans la fonction lambda . Dans ce cas, vous souhaitez créer un sous-ensemble aux quatre derniers nombres de chaque identifiant, ce qui ne peut être fait qu'en convertissant l'identifiant entier en chaîne.

Cela signifie que l'expression triée avec une fonction lambda pour la clé est:

def last_four(x):
    return str(x)[-4:]

sorted(ids, key=last_four)

Cela dit de trier la liste par les quatre derniers chiffres de chaque identifiant après avoir converti l'identifiant en chaîne.

Une façon équivalente de faire cela en utilisant une fonction nommée est:

ids = [17573005, 17572342, 17579000, 17570002, 17572345, 17579329]
sorted(ids, key=lambda x: str(x)[-4:])

# Output
[17570002, 17572342, 17572345, 17573005, 17579000, 17579329]

Le choix vous appartient. L'expression lambda est moins de code, mais la fonction nommée ( last_four ) peut être plus facile à comprendre.


7 commentaires

La façon dont vous l'avez écrit en utilisant trié et key = lambda a du sens pour moi! Lorsque j'essaye d'utiliser key = last_four, je rencontre des problèmes. J'ai l'impression de faire une erreur stupide. Voici ce que j'essaye de faire: def last_four (x): return x [-4:] ids = [17573005, 17572342, 17579000, 17570002, 17572345, 17579329] sorted_ids = sorted (ids, key = last_four )


Vous devez convertir x en str dans last_four si vous comptez le faire de cette façon.


J'ai mis à jour ma réponse pour montrer comment résoudre le problème en utilisant une fonction nommée pour la clé dans trié .


Cela l'a fait! Erreurs stupides de ma part, merci pour le code clair et la patience!


Pas de problème, tout le monde fait des erreurs stupides, peu importe l'expérience qu'il a!


De plus, si cela résout votre problème (je serai ravi de vous aider si vous avez besoin de plus), vous pouvez cocher la réponse pour faire savoir aux autres qu'elle a été résolue.


juste coché votre réponse, merci encore pour votre aide!



0
votes

c'est faux

def last_four (x): r = [] pour i dans x: r.append (str (i) [- 4:])

r = sorted(r)
print(r)
return r

ids = [17573005, 17572342, 17579000, 17570002, 17572345, 17579329]

sorted_ids = last_four (ids)


1 commentaires

De l'avis: Bonjour, ne répondez pas uniquement avec le code source. Essayez de fournir une belle description du fonctionnement de votre solution. Voir: Comment rédiger une bonne réponse? . Merci



0
votes

Vous pouvez essayer ceci:

def last_four(x):
    x = x-17570000
    return x
a
ids = [17573005, 17572342, 17579000, 17570002, 17572345, 17579329]    
sorted_ids = sorted(ids, key=lambda x:last_four(x))
print(sorted_ids)


1 commentaires

Bienvenue à SO, Ishant Nand. Veuillez essayer de formater votre code correctement afin que d'autres puissent le lire facilement.



1
votes

La meilleure façon de faire est de prendre le mod du nombre. Par exemple: 17573005% 10000 = 3005 qui est le résultat requis.

sorted_id = sorted(ids,key = lambda k: k%10000)

Et puis appelez cette fonction comme une clé de la fonction sorted ()

ids = [17573005, 17572342, 17579000, 17570002, 17572345, 17579329]
sorted_ids = sorted(ids,key=last_four)

En utilisant maintenant lambda, cela ressemblerait à:

def last_four(x):
    return x%10000


0 commentaires