как вывести из файла строку с наибольшим номером - PullRequest
0 голосов
/ 01 февраля 2019

Я хочу знать, как найти строку с наибольшим номером в ней, и я также хочу, чтобы решение было простым и легким для понимания.

У меня есть файл, в котором есть эти оценки в этомформат:

bob has 46 points
fred has 0 points
leo has 27 points
max has 34 points
john has 58 points
paolw has 32 points
piper has 20 points
hasan has 72 points

Я хочу, чтобы эти баллы печатались от наименьшего к меньшему, например:

hasan has 72 points
john has 58 points
bob has 46 points
max has 34 points
paolw has 32 points
leo has 27 points
piper has 20 points
fred has 0 points

Вот что я пробовал:

f = open("file.txt","r") print(sorted(f)) 

Результат был такой:

['\n', 'bob has 46 points\n', 'fred has 0 points\n', 'hasan has 72 points\n', 'john has 58 points\n', 'leo has 27 points\n', 'max has 34 points\n', 'paolw has 32 points\n', 'piper has 20 points\n']

Ответы [ 4 ]

0 голосов
/ 02 февраля 2019

Ваша первая попытка была на полпути, но вы, кажется, застряли на сортировке.Когда вы вызываете sorted(f), на самом деле там происходит несколько вещей.

  1. sorted запрашивает у объекта f что-то итерируемое, а f возвращает набор строк, представляющих каждую строкуyour file.txt
  2. Затем строки были отсортированы на основе значений ascii каждого символа в лексикографическом порядке (отсортировано как словарь).
  3. Сортированные строки были помещеныв список и вернулся.

Большой вывод здесь заключается в том, что каждая строка была отсортирована по тексту, а не по числовому значению, спрятанному где-то посередине.

Если вы хотитедля сортировки с использованием встроенной функции sorted (т. е. вы не хотите писать собственный алгоритм сортировки), вам необходимо либо реструктурировать свои данные так, чтобы метод сортировки по умолчанию давал вам нужный порядокили вам нужно указать функции sorted, как немного изменить ее поведение по умолчанию.Последнее включает в себя указание параметра key, переданного в sorted, который охватили другие ответы.

Чтобы получить sorted, чтобы сделать то, что мы хотим, из ворот, нам нужно дать ему значение, которое мыхочу отсортировать первым в каждой строке.Мы можем сделать это, извлекая число из каждой строки и помещая его сначала в список, а затем снова избавляясь от него после сортировки списка строк.

f = open("file.txt","r")
lines = list(f) #create a list of strings
f.close() #don't forget to close our files when we're done. It's good practice.
modified_lines = [] #empty list to put our modified lines in (extracted number, original line)
for line in lines: #iterate over each line
    if line.strip(): #if there's anything there after we strip away whitespace
        score = line.split(' ')[2] #split our text on every space and take the third item
        score = int(score) #convert the string of our score into a number
        modified_lines.append([score, line]) #add our modified line to modified_lines

#sort our list that now has the thing we want to sort based on is first
sorted_modified_lines = sorted(modified_lines) 

#take only the string (not the number we added before) and print it without the trailing newline.
for line in sorted_modified_lines: print(line[1].strip())
0 голосов
/ 01 февраля 2019

Сортировка - это то, что вы хотите, добавьте key, чтобы получить то, что вы хотите.

Замените список данными вашего файла.

l = ["bob has 46 points", "fred has 0 points", "leo has 27 points"]
l = sorted(l, key = lambda i: int(i.split()[2]), reverse = True)

Вывод

['bob has 46 points', 'leo has 27 points', 'fred has 0 points']
0 голосов
/ 01 февраля 2019

Я думаю, что это решение для начинающих:

scores = {}

with open("file.txt", "r") as f:
    for score in f.readlines():
        try:
            name = score.split(" ")[0]
            points = score.split(" ")[2]
            scores.update({name: int(points)})
        except IndexError:
            pass

scores = sorted(scores.items(), key=lambda kv: kv[1], reverse=True)


for name, points in scores:
    row = f"{name} has {points} points\n"
    print(row)

РЕДАКТИРОВАТЬ: Добавить обработку исключений, если ваш файл file.txt отличается от моего файла примера.

0 голосов
/ 01 февраля 2019

Использование sorted:

with open('file.txt') as f: 
    print(
        '\n'.join(
            sorted(
                filter(
                    lambda line: len(line.split(' ')) >= 2,
                    f.readlines()
                ), 
                key=lambda line: int(line.split(' ')[-2]), 
                reverse=True
            )
        )
    )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...