У меня есть текстовый файл, который выглядит так:

Joe Smith: 200 dollars
Marcus: 150 dollars
Sally Mae: 300 dollars

И т.д ..

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

["Sally Mae: 300 dollars", "Joe Smith: 200 dollars", "Marcus: 150 dollars"]

Любая помощь будет принята с благодарностью!

-2
DevinGP 31 Дек 2017 в 22:54

2 ответа

Лучший ответ

Вы можете использовать функцию sorted с указанными ниже лямбда-функция в качестве ключа для извлечения чисел и их сортировки.

#                         v to only match numbers preceded with colon ':' and space
lambda x: int(re.search('(?<=:\s)\d+', x).group())
#          ^                       ^ match the pattern with continuing numbers
#          ^  type-cast the string of number to int
# `sorted` will use this returned int to sort the elements 

Например:

>>> import re
>>> my_list = ["Joe Smith32: 200 dollars", "Marcus: 150 dollars", "Sally Mae: 300 dollars"]

>>> sorted(my_list, key=lambda x: int(re.search('(?<=:\s)\d+', x).group()), reverse=True)
['Sally Mae: 300 dollars', 'Joe Smith32: 200 dollars', 'Marcus: 150 dollars']

По умолчанию sorted сортируется в порядке возрастания. Используйте reverse=True для сортировки по убыванию.

Все, что вам нужно для открытия файла и чтения его содержимого в виде списка:

with open('/path/tofile.txt') as f:
    my_list = f.readlines()

Примечание. Как упоминалось в комментарии, OP пояснил, что помимо номеров, по которым необходимо выполнить сортировку, единственным другим местом, где эти номера могут присутствовать, является имя пользователя. Следовательно, использовать это выражение безопасно.

2
Moinuddin Quadri 1 Янв 2018 в 05:29

Вы можете просто попробовать что-то вроде этого:

import re
pattern=r'\d+'
sort_dict=[]
with open('file.txt','r') as f:
    for line in f:
        match=re.search(pattern,line)
        sort_dict.append((int(match.group()),line.strip()))
for i in sorted(sort_dict)[::-1]:
    print(i[1])

Выход:

Sally Mae: 300 dollars
Joe Smith: 200 dollars
Marcus: 150 dollars
0
user9158931user9158931 1 Янв 2018 в 19:46