2
votes

Comment trier numériquement la liste des chaînes contenant des nombres?

345345:player7
435:zo
345:name
23:hello
1231:football

4 commentaires

j'ai également besoin d'aide pour ajouter d'autres valeurs sans tout supprimer du fichier externe


Vous devrez ouvrir le fichier en utilisant 'a' qui signifie append. f1 = open ("leader", 'a')


Il est préférable que vous puissiez publier des questions séparées au lieu de combiner vos questions en une seule. De cette façon, cela aide les personnes qui répondent à votre question et aussi les autres à chercher au moins une de vos questions. Veuillez consulter Comment demander et La question parfaite . Il n'est pas clair si vous rencontrez des problèmes pour mettre des données dans des structures de données, lire des données à partir d'un fichier, trier des données, insérer des données (les dictionnaires ne sont pas ordonnés ou triés par insertion - pas par des nombres) ou si vous ne pouvez pas enregistrer les données.


Voici ce que vous voulez probablement: Comment créer un meilleur score en python


3 Réponses :


4
votes

IIUC:

['23:hello', '345:name', '435:zo', '1231:football', '345345:player7']

Sortie:

l = ['345345:player7',
'435:zo',
'345:name',
'23:hello',
'1231:football']

sorted(l, key=lambda x: int(x.split(':')[0]))


4 commentaires

N'avez-vous pas besoin d'analyser les chiffres dans int lors du tri puisque OP a mentionné trier les nombres ?


eh bien, il semble fonctionner, mais n'effectue pas de tri numérique, juste un tri lexicographique. 1231 devrait apparaître après 435 par exemple.


Bon, ça ne lancera certainement pas d'erreur mais je pense qu'OP voulait la réponse de @ Jean-FrançoisFabre ici.


cependant cela ne fonctionne pas car il doit être généré à partir d'un fichier externe et génère ceci:



4
votes

La clé de tri doit faire: "diviser une fois, convertir en entier". Ne pas convertir en nombre entier échoue car la comparaison lexicographique est alors utilisée et dans ce cas "10" , pas ce que vous voulez.

def sortfunc(x):
    number,rest = x.split(':',1)
    return int(number),rest

result = sorted(l, key=sortfunc)

result:

['23:hello', '345:name', '435:zo', '1231:football', '345345:player7']

qui ne gère pas le départage où les nombres sont égaux. Une clé de tri légèrement plus complexe serait requise (mais toujours faisable). Dans ce cas, supprimez lambda et créez une fonction réelle afin de pouvoir effectuer un fractionnement une fois et décompresser pour convertir uniquement la première partie en entier:

l = ['345345:player7',
'435:zo',
'345:name',
'23:hello',
'1231:football']

result = sorted(l, key=lambda x: int(x.split(':',1)[0]))
p >


0 commentaires

0
votes

Essayez ceci: (utile si vous lisez toujours un fichier)

with open('leader.txt', mode = 'r') as f1:
    data = f1.readlines()
# end with
keys = {}
output = []
for s in data:
    num, value = s.split(sep=':')
    if keys.get(int(num), False):
        keys[int(num)].append(value)
    else:
        keys[int(num)] = [value]
for num in sorted(keys):
    for i in keys[num]:
        output.append((num, i))
for num, value in output:
    print(f'{num}: {value}')


3 commentaires

Je pense que votre num, value = int (s.split (sep = ':')) générera une erreur


si 2 personnes ont le même numéro, seule la dernière survivra après avoir corrigé l'erreur ValueError en analysant une liste contenant un nombre et une chaîne.


désolé pour les int autour de la liste. n'a pas fait attention haha ​​... je vais résoudre le problème d'un numéro de deux personnes.