我的文本文件包含解析记录文件,文件包含: file:output.log 最终结果应该是: 1.使用最大数字
对列表进行排序 rt01,te1/1,111,11
rt02,te1/1,11,10
rt01,te1/2,122,20
rt02,te1/2,113,5
rt02,te1/3,10,1
rt03,te1/1,1,6
rt03,te1/2,11,8
结果:
rt01,te1/2,122,20
rt01,te1/1,111,11
rt02,te1/1,11,10
rt03,te1/2,11,8
rt03,te1/1,1,6
rt02,te1/2,113,5
rt02,te1/3,10,1
获取列表中的最大值的最佳方法是什么:
我试试:
results = []
top = []
bottom = []
found = 0
with open('Python/output.log', 'r') as f:
for line in f:
line = line.split(",")
results.append(line)
print results
for i,j in enumerate(results[:-1]):
#print results[i+1][3]
if j[3] > results[i+1][3]:
top.append(j)
elif results[i+1][3] > top[3]:
bottom.append(results[i+1])
if top[i-1][3] > results[i+1][3]:
top.append(j.pop())
bottom.append(j)
#top.append(j[])
print(top)
print(bottom)
答案 0 :(得分:1)
您可以使用每行中的最后一个数字作为sorted()
的键:
with open('test.txt') as f:
data = f.read().splitlines()
data = sorted(data, key= lambda x: int(x.split(',')[-1]), reverse=True)
print('\n'.join(data))
输出:
rt01,te1/2,122,20
rt01,te1/1,111,11
rt02,te1/1,11,10
rt03,te1/2,11,8
rt03,te1/1,1,6
rt02,te1/2,113,5
rt02,te1/3,10,1
答案 1 :(得分:0)
我自己的解决方案,类似于@chrisz sorted()
,但使用csv
库
import csv
results = []
with open('Python/output.log', 'r') as f:
csvreader = csv.reader(f)
for line in csvreader:
results.append(line)
sorted_results = sorted(results, key=lambda x: int(x[3]), reverse=True)
输出:
[['rt01', 'te1/2', '122', '20'],
['rt01', 'te1/1', '111', '11'],
['rt02', 'te1/1', '11', '10'],
['rt03', 'te1/2', '11', '8'],
['rt03', 'te1/1', '1', '6'],
['rt02', 'te1/2', '113', '5'],
['rt02', 'te1/3', '10', '1']]
答案 2 :(得分:0)
这是natural sort的变体。如果您只按CSV行中的最终数字进行分组,则可以在','
上拆分,将其转换为int
,然后取消以获得max-> min排序:
s='''\
rt01,te1/1,111,11
rt02,te1/1,11,10
rt01,te1/2,122,20
rt02,te1/2,113,5
rt02,te1/3,10,1
rt03,te1/1,1,6
rt03,te1/2,11,8'''
print '\n'.join(sorted(s.splitlines(), key=lambda s: -int(s.split(',')[-1])))
打印:
rt01,te1/2,122,20
rt01,te1/1,111,11
rt02,te1/1,11,10
rt03,te1/2,11,8
rt03,te1/1,1,6
rt02,te1/2,113,5
rt02,te1/3,10,1
由于Python使用stable sort,因此除非按最终列排序,否则第一列中的组将保持文件顺序。
如果要按最后一列和第一列中的数字对BOTH进行排序,可以使用正则表达式并执行以下操作:
import re
def f(line):
digits=map(int, re.findall(r'\d+', line))
return digits[0], -digits[-1]
print '\n'.join(sorted(s.splitlines(), key=f))
打印:
rt01,te1/2,122,20
rt01,te1/1,111,11
rt02,te1/1,11,10
rt02,te1/2,113,5
rt02,te1/3,10,1
rt03,te1/2,11,8
rt03,te1/1,1,6
或者,如果您想主要按最后一列排序,而是按第一列排序,则可以反转f
返回的元组的顺序:
def f(line):
digits=map(int, re.findall(r'\d+', line))
return -digits[-1], digits[0]
print '\n'.join(sorted(s.splitlines(), key=f))