J'ai des problèmes avec mon code ci-dessous. J'ai mes deux listes noms et scores. Ces listes correspondent à l'autre comme indiqué ci-dessous. Mon objectif est d'imprimer les trois premiers articles les plus grands des deux listes. J'ai tenté de les trier ensemble de plus au moins, puis d'imprimer les trois premiers articles, mais je reçois un peu de frais. Des pensées? Merci. Exemple Sortie: P> Spec 450
Meng 300
Sparc 200
8 Réponses :
Le seul problème avec votre code est la partie imprimée (et vous devez inverser le tri): Je vous suggère d'utiliser
collections.Counter code> : P> from collections import Counter
names = ['Xander', 'Spec', 'Meng', 'Sparc', 'Jones', 'Nick', 'Link']
scores = [120, 450, 300, 200, 66, 183, 80]
counter = Counter({name: score for name, score in zip(names, scores)})
print(counter.most_common(3))
# [('Spec', 450), ('Meng', 300), ('Sparc', 200)]
Si votre problème est dans la partie Imprimer:
for i in range(3):
print(names[i], scores[i])
Votre impression dans la dernière ligne est fausse. Vous ne pouvez pas concaténer code> objet code> avec str code> comme ça. Faites cela à la place: scores, names = (list(t) for t in zip(*sorted(zip(scores, names), reverse=True)))
for i in range(3):
print(names[i], scores[i])
On dirait que vous essayez de concaténer deux listes et une chaîne dans votre relevé d'impression. La réponse de Daniel Möller est correcte. Aussi, vous devrez peut-être passer true code> à l'argument "code> inverse = code>" sinon vous obtiendrez les trois plus petits: names = ['Xander', 'Spec', 'Meng', 'Sparc', 'Jones', 'Nick', 'Link']
scores = [120, 450, 300, 200, 66, 183, 80]
scores, names = (list(t) for t in zip(*sorted(zip(scores, names), reverse=True)))
for i in range(3):
print(names[i], scores[i])
Spec 450
Meng 300
Sparc 200
Voici la solution comme modifications suggérées, cela peut être effectué d'une manière plus élégante comme celle-ci. p> itemGetter comme suggéré par @jab p>
Vous pouvez modifier la commande dans le code zip code> à (scores, noms), puis vous n'avez pas besoin de ne pas transmettre l'argument de clé dans Trier code>. Rien de fantaisie mais sera beaucoup plus élégant
Aussi opérateur.Itemplgeter (1) code> est plus préféré que lambda x: x [1] code> il est plus efficace et lit mieux
@mad_ Ouais qui a été utile.
@Jab opérateur.Itempstter (1) est plus lisible (ne peut pas dire sur l'efficacité), je ne veux pas inclure une bibliothèque supplémentaire, c'est pourquoi je m'envoie avec une approche de Lambda.
Opérateur Code> est une bibliothèque intégrée et il est plus efficace et plus puissant. Voir: opérateur.itemgeter ou lambda
@Jab Yeah, tu as raison, je ne connaissais pas cette différence de performance, merci de suggérer.
Ce n'est pas que c'est une énorme différence, mais il est bon d'avoir l'habitude d'utiliser quelque chose de plus lisible et mieux surtout quand il est inclus comme intégré. lambda code> peut être plus rapide / plus facile à saisir mais compte de lisibilité. Et l'impact de la performation sera là quand il est nécessaire
@Jab Yeah Readabilit compte, si vous voyez la solution de jdharo opérateur.Iltemptter ou Lambda Ensuite, je pense que c'est une grande lacune de performance.
Vous pouvez utiliser cette sortie: p> hePq.nlargest code>:
Vous pouvez zip et trier les données à l'aide de cette sortie: P> opérateur.Itemplgetter code> puis imprimez les données telles que: Spec: 450
Meng: 300
Sparc: 200
Si sortie: p> noms code> est unique, je suggère une utilisation de dict code>, suivante: Spec 450
Meng 300
Sparc 200
Quelle est l'erreur exacte? Il ne devrait pas y avoir rien de rien oublié ici.
Vous n'avez pas inclus l'erreur. Vous essayez de concaténer STR avec la liste qui n'est pas possible. Essayez:
"" .join (carte (Str, scores [: 3]) code>