我有一个文本文件,其中包含用户名及其计数,如下所示:
[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)
答案 0 :(得分:1)
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 :(得分:1)
您可以使用内置函数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']
工作原理。
引用docs:
list.sort()
和sorted()
都有一个关键参数,用于指定在进行比较之前在每个列表元素上要调用的函数。
我的示例是在下一个lambda expression处传递给key
参数:
lambda item: int(item[item.index(":") + 1:])
等效于功能:
def func(item):
return int(item[item.index(":") + 1:])
此函数(或lambda)从源字符串chars after“:”符号复制并将结果字符串转换为int。
每个排序迭代python在进行比较之前都会将此函数调用为“ cook”元素。
答案 2 :(得分:0)
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')
答案 3 :(得分:0)
尝试一下
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
)替换换行符(''
)
答案 4 :(得分:0)
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)
答案 5 :(得分:0)
我们需要使用-k
选项指定要进行排序的字段。有关更多详细信息,请参阅链接:https://unix.stackexchange.com/questions/77406/sort-only-on-the-second-column
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'))
Output
:
[test2]:1097
[test7]:568
[test3]:461
[test9]:373
[test10]:320
[test4]:156
[test8]:17
[test5]:16
[test1]:11
[test6]:9