如何按从高到低对字母数字列表进行排序(Python)

如何按从高到低对字母数字列表进行排序(Python),python,sorting,csv,Python,Sorting,Csv,在我的程序中,Python打开一个CSV Excel文件并读取它。该文件包含字母数字数据,在Excel文件中分为三个不同的单元格。然后程序将数据列为一个列表 程序应按数字数据对列表进行排序,从高到低。 但我一直无法找到解决办法 到目前为止,我已经: def highlow (): file = open("Thisfile.csv", "r" ) read = file.readlines () list(read) 我试过: read.sort () 但当我打印“阅

在我的程序中,Python打开一个CSV Excel文件并读取它。该文件包含字母数字数据,在Excel文件中分为三个不同的单元格。然后程序将数据列为一个列表

程序应按数字数据对列表进行排序,从高到低。 但我一直无法找到解决办法

到目前为止,我已经:

def highlow ():
    file = open("Thisfile.csv", "r" )
    read = file.readlines ()
    list(read)
我试过:

read.sort ()
但当我打印“阅读”时,我得到的是:

['ANDERSON,Jane,7\n', 'BIRCH,Darren,9\n', 'MCKOLEEP,Philip,6\n', 'SMITH,Richard,3\n']

相反,我希望列表按每个项目中的整数排序,而不是按字母顺序排序。

首先读取带有的CSV,这将为您提供正确分隔的值:

import csv

with open("Thisfile.csv", "rb") as file:
    reader = csv.reader(file)
    rows = [r[:-1] + [int(r[-1])] for r in reader]

rows.sort(key=lambda r: r[-1])
rows=[…]行在读取CSV文件时使用一个字符串将最后一列转换为整数对象

将行作为单独的列表,排序就变得相对简单;只需对最后一列进行排序,这就是key=lambda r:r[-1]位的作用

演示:


首先,使用读取CSV,这将为您提供正确分隔的值:

import csv

with open("Thisfile.csv", "rb") as file:
    reader = csv.reader(file)
    rows = [r[:-1] + [int(r[-1])] for r in reader]

rows.sort(key=lambda r: r[-1])
rows=[…]行在读取CSV文件时使用一个字符串将最后一列转换为整数对象

将行作为单独的列表,排序就变得相对简单;只需对最后一列进行排序,这就是key=lambda r:r[-1]位的作用

演示:


你可以用这样的东西:

read = sorted(read, key=lambda data: data.replace('\n', '').split(',', 3)[2])

你可以用这样的东西:

read = sorted(read, key=lambda data: data.replace('\n', '').split(',', 3)[2])
您可以尝试使用operator.itemgetter,这使它非常直观

import csv
from operator import itemgetter

rows = []

with open("Thisfile.csv", "rb") as f:
    csv_reader = csv.reader(f1)
    for row in csv_reader:
        rows.append(row)

# This sorts by column #2 in descending order:
sorted_rows = sorted(rows, key=itemgetter(2), reverse=True)

>>>
[['BIRCH', 'Darren', '9'],
 ['ANDERSON', 'Jane', '7'],
 ['MCKOLEEP', 'Philip', '6'],
 ['SMITH', 'Richard', '3']]
您还可以通过将最后一行更改为:

rows.sort(key=itemgetter(2), reverse=True)
其他: 如果在最后一列中有重复的数值,也可以方便地进行二次排序,比如说,在按数值排序后,可以按姓氏排序。例如,如果csv中有以下行:

ANDERSON,Jane,7
BIRCH,Darren,9
MCKOLEEP,Philip,6
SMITH,Richard,3
WELSH,John,3
然后可以使用以下行进行排序:

sorted_rows = sorted(rows, key=itemgetter(2,0), reverse=True)
这将首先按第2列进行排序,然后再按第0列进行排序,所有排序都按降序进行,并给出以下输出:

[['BIRCH', 'Darren', '9'],
 ['ANDERSON', 'Jane', '7'],
 ['MCKOLEEP', 'Philip', '6'],
 ['WELSH', 'John', '3'],
 ['SMITH', 'Richard', '3']]
您可以尝试使用operator.itemgetter,这使它非常直观

import csv
from operator import itemgetter

rows = []

with open("Thisfile.csv", "rb") as f:
    csv_reader = csv.reader(f1)
    for row in csv_reader:
        rows.append(row)

# This sorts by column #2 in descending order:
sorted_rows = sorted(rows, key=itemgetter(2), reverse=True)

>>>
[['BIRCH', 'Darren', '9'],
 ['ANDERSON', 'Jane', '7'],
 ['MCKOLEEP', 'Philip', '6'],
 ['SMITH', 'Richard', '3']]
您还可以通过将最后一行更改为:

rows.sort(key=itemgetter(2), reverse=True)
其他: 如果在最后一列中有重复的数值,也可以方便地进行二次排序,比如说,在按数值排序后,可以按姓氏排序。例如,如果csv中有以下行:

ANDERSON,Jane,7
BIRCH,Darren,9
MCKOLEEP,Philip,6
SMITH,Richard,3
WELSH,John,3
然后可以使用以下行进行排序:

sorted_rows = sorted(rows, key=itemgetter(2,0), reverse=True)
这将首先按第2列进行排序,然后再按第0列进行排序,所有排序都按降序进行,并给出以下输出:

[['BIRCH', 'Darren', '9'],
 ['ANDERSON', 'Jane', '7'],
 ['MCKOLEEP', 'Philip', '6'],
 ['WELSH', 'John', '3'],
 ['SMITH', 'Richard', '3']]