Как отсортировать по 2 целым числам - PullRequest
1 голос
/ 08 ноября 2019

Я пробовал много вариантов, чтобы попытаться получить сортировку правильно, но безуспешно. используя этот фрагмент кода, он предназначен для вывода полностью отсортированного списка в winlist.txt, но он сортирует только по первому целому числу, поэтому он не сортируется должным образом.

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

в настоящее время этот фрагмент кода выводит:

11 Tom
2 Tom
20 Ben
20 Tom
21 Ben

Но я хочу, чтобы сортировка сортировалась с двумя целыми числами, а не только с первым. так что 2 выше 11

Ответы [ 4 ]

1 голос
/ 08 ноября 2019

Попробуйте использовать аргумент key:

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')
0 голосов
/ 08 ноября 2019

потому что функция python open возвращает некоторый String объект, поэтому число, подобное этому "11", но не 11, вы можете преобразовать его как int(), но есть простой способ, используйте pandasMoudle. Я предполагаю, что ваш текст таков:

11 Tom
2 Tom
20 Ben
20 Tom
21 Ben

1. сначала используйте стороннюю (рекомендуем)

. вам нужно установить pandas, pip install pandas.

pands.read_csv site

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 Tom
11 Tom
20 Ben
20 Tom
21 Ben

2. оригинальное решение для функций Python

Не используйте сторонние, мы тоже можем это сделать.

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')
0 голосов
/ 08 ноября 2019

Ваш winfile, после прочтения из winners.txt, содержит список строк.

Именно поэтому функция sort () сортирует вашу строку по алфавиту.

С одной стороны, вы можете разбить свои строки на два элемента tuple / list (самый быстрый - это split () на list), преобразовать первый элемент в int.

Теперь вы сортируете этот список. Выводом будет сам список строк.

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 голосов
/ 08 ноября 2019

Чтобы отсортировать строки по первому столбцу, необходимо сначала разделить их, а затем отсортировать соответственно, указав правильные значения key для sort():

import operator

if __name__ == "__main__":
    with open("to_be_sorted.txt", "r", encoding="utf-8") as f:
        data = [line.split() for line in f.readlines()]

    sort_by_first_column = lambda line: int(operator.itemgetter(0)(line))
    data.sort(key=sort_by_first_column)

    for line in data:
        print(" ".join(line))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...