1
votes

Comment trier par 2 entiers

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


1 commentaires

Son tri par le premier caractère, il n'y a pas d'entiers dans une chaîne - vous devez le convertir


4 Réponses :


1
votes

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')


1 commentaires

Merci, cela a été très utile, car c'est compact et je le comprends.



0
votes

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


0 commentaires

0
votes

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')


0 commentaires

0
votes

parce que la fonction python 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é)

en premier. vous devez installer des pandas, pip installer des pandas .

pands.read_csv site

2 Tom
11 Tom
20 Ben
20 Tom
21 Ben

enfin, le résultat comme celui-ci p>

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

N'utilisez pas de tiers, nous pouvons le faire aussi.

11 Tom
2 Tom
20 Ben
20 Tom
21 Ben


0 commentaires