У меня есть текстовый файл, который содержит имя пользователя и их количество, как показано ниже:

[test1]:11
[test2]:1097
[test3]:461
[test4]:156
[test5]:16
[test6]:9
[test7]:568
[test8]:17
[test9]:373
[test10]:320

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

[test2]:1097
[test7]:568
[test3]:461
[test9]:373
[test10]:320
[test4]:156
[test8]:17
[test5]:16
[test1]:11
[test6]:9

Пожалуйста, помогите мне достичь этого в python3.

Я пытался сделать это так .. что не работает.

subprocess.Popen(['sort', '-n', '-r', 'Test.txt'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT)

1
Arpitha M 8 Июл 2019 в 08:43

6 ответов

Лучший ответ
data = '''[test1]:11
[test2]:1097
[test3]:461
[test4]:156
[test5]:16
[test6]:9
[test7]:568
[test8]:17
[test9]:373
[test10]:320'''

for line in sorted(data.splitlines(), key=lambda k: int(k.split(':')[-1]), reverse=True):
    print(line)

Печать :

[test2]:1097
[test7]:568
[test3]:461
[test9]:373
[test10]:320
[test4]:156
[test8]:17
[test5]:16
[test1]:11
[test6]:9

РЕДАКТИРОВАТЬ: с чтением из файла вы можете сделать это:

with open('Test.txt', 'r') as f_in:
    for line in sorted(f_in.readlines(), key=lambda k: int(k.split(':')[-1]), reverse=True):
        print(line.strip())
1
Andrej Kesely 8 Июл 2019 в 05:46

Нам нужно указать поле, по которому мы будем сортировать, используя опцию -k. Для получения дополнительной информации перейдите по ссылке: https://unix.stackexchange.com / вопросы / 77406 / сортировать только - на- второй колонке

Code :

import subprocess
process = subprocess.Popen(['sort', '-n', '-r', '-t:', '-k2,2', 'input.txt'], stdout=subprocess.PIPE, stderr=subprocess.STDOUT) # start index 2 and end index =2 for sroting
stdout = process.communicate()[0]
print(stdout.decode('utf-8'))

{{Х0}} :

[test2]:1097
[test7]:568
[test3]:461
[test9]:373
[test10]:320
[test4]:156
[test8]:17
[test5]:16
[test1]:11
[test6]:9
0
Durgesh Kumar 8 Июл 2019 в 06:29
def dict_val(x):
...     return x[1]

###First Read the File
f = open('test.txt','r')
content = f.readlines()

# Now add contents of file to a dict
count_dict = {}
for line in content:
...     key,value = line.split(':')
...     count_dict[key] = value

### Now using sorted function to sort values.
sorted_x = sorted(count_dict.items(), key=dict_val)
print(sortex_x)


0
Karandeepdps 8 Июл 2019 в 06:22

Вы можете использовать встроенную функцию sorted() (или list.sort() (что эквивалентно):

s = """[test1]:11
[test2]:1097
[test3]:461
[test4]:156
[test5]:16
[test6]:9
[test7]:568
[test8]:17
[test9]:373
[test10]:320"""
lst = s.splitlines()
sorted_lst = sorted(lst, key=lambda item: int(item[item.index(":") + 1:]), reverse=True)
print(sorted_lst)

Выход:

['[test2]:1097', '[test7]:568', '[test3]:461', '[test9]:373', '[test10]:320', '[test4]:156', '[test8]:17', '[test5]:16', '[test1]:11', '[test6]:9']

Как это работает .

Цитата из документов:

list.sort() и sorted() имеют параметр ключа для указания функции, которая будет вызываться в каждом списке элемент до проведения сравнений.

В моем примере я передаю параметр key следующему лямбда-выражению :

lambda item: int(item[item.index(":") + 1:])

Это эквивалентно функции:

def func(item):
    return int(item[item.index(":") + 1:])

Эта функция (или лямбда) копирует из исходных строковых символов после Символ ":" и приведение строки результата к int.

Каждый итерационный питон сортировки будет вызывать эту функцию для «приготовления» элемента перед сравнением.

1
Olvin Roght 8 Июл 2019 в 07:15

Попробуй это,

with open('file1.txt','r') as f:
    print(sorted([line.replace('\n','') for line in f], key = lambda x:int(x.replace('\n','').split(':')[-1]), reverse=True))

< Сильный > Вывод :

['[test2]:1097', '[test7]:568', '[test3]:461', '[test9]:373', '[test10]:320', '[test4]:156', '[test8]:17', '[test5]:16', '[test1]:11', '[test6]:9']

< Сильный > Примечание :

Он заменит символ новой строки (\n) пустой строкой ('')

0
shaik moeed 8 Июл 2019 в 05:53
res =[]
with open('result.txt') as f:
    tmp=[]
    for i in f.readlines():
        tmp=i.strip('\n').split(':')
        res.append(tmp)

sol = sorted(res, key=lambda x:x[1])
with open('solution.txt','a+') as f:
    for i in sol:
        f.write(r'{}:{}'.format(i[0],i[1])+'\n')
0
sahasrara62 8 Июл 2019 в 05:53