在列表中查找最大值

时间:2018-04-12 01:44:11

标签: python list

我的文本文件包含解析记录文件,文件包含: 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)

3 个答案:

答案 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))