J'ai essayé de nombreuses options pour essayer d'obtenir le tri correct sans succès. en utilisant ce morceau de code, il est destiné à afficher une liste entièrement triée sur winlist.txt, mais il ne trie que par le premier entier, donc il ne trie pas correctement.
11 Tom 2 Tom 20 Ben 20 Tom 21 Ben
actuellement, ce morceau de code produit :
def sort(): winfile = list() with open ('winners.txt') as fin: for line in fin: winfile.append(line.strip('\n')) winfile.sort() with open('SortWin.txt', 'w+') as fout: for winfile in winfile: fout.write(winfile + '\n')
Mais je veux que le tri soit trié avec 2 entiers au lieu du seul premier. pour que le 2 vienne au-dessus du 11
4 Réponses :
Essayez d'utiliser l'argument clé
:
def sort(): winfile = list() with open ('winners.txt') as fin: for line in fin: winfile.append(line.strip('\n')) winfile.sort(key=lambda x: int(x.split()[0])) with open('SortWin.txt', 'w+') as fout: for winfile in winfile: fout.write(winfile + '\n')
Merci, cela a été très utile, car c'est compact et je le comprends.
Afin de trier les lignes par la première colonne, vous devez d'abord les diviser puis les trier en conséquence, en fournissant la clé
appropriée à sort ()
: < pré> XXX
Votre winfile, après avoir lu winners.txt, contient une liste de chaînes.
C'est pourquoi la fonction sort () trie votre chaîne par ordre alphabétique.
D'une manière, vous pouvez diviser vos chaînes en tuple / liste à deux éléments (le plus rapide est divisé () en liste), transtyper le premier élément en int.
Maintenant, vous triez cette liste. La sortie sera une liste de chaînes en elle-même.
def get_key(pair): pair = pair.split() return int(pair[0]) def sort(): winfile = list() with open ('winners.txt') as fin: for line in fin: winfile.append(line.strip('\n')) winfile.sort(key = get_key) with open('SortWin.txt', 'w+') as fout: for winfile in winfile: fout.write(winfile + '\n')
parce que la fonction python en premier. vous devez installer des pandas, enfin, le résultat comme celui-ci p> N'utilisez pas de tiers, nous pouvons le faire aussi. open
renverra un objet String
, donc le nombre comme celui-ci "11"
mais pas 11 code>, vous pouvez le convertir par
int ()
, mais il existe un moyen simple, utilisez pandas
moudle.
Je suppose que votre texte est le suivant: def sort():
winfile = list()
with open ('winners.txt') as fin:
for line in fin:
winfile.append(line.strip('\n'))
winfile.sort(key=lambda x: int(x.split(' ')[0]))
with open('SortWin.txt', 'w+') as fout:
for winfile in winfile:
fout.write(winfile + '\n')
1. utilisez un tiers (recommandé)
pip installer des pandas
. 2 Tom
11 Tom
20 Ben
20 Tom
21 Ben
import pandas as pd
# sep is Delimiter to use, default is comma
df = pd.read_csv('winners.txt', header=None, names=['num', 'name'], sep=' ', dtype={'num': int, 'name': str})
df = df.sort_index(by='num')
df.to_csv('SortWin.txt', index=False, sep=' ', header=None, mode='w+')
2. solution de fonction python originale
11 Tom
2 Tom
20 Ben
20 Tom
21 Ben
Son tri par le premier caractère, il n'y a pas d'entiers dans une chaîne - vous devez le convertir