如何按字母顺序从最高到最低排序(Python)

时间:2015-06-07 18:30:06

标签: python sorting csv

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

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

到目前为止,我有:

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

我试过了:

read.sort ()

但是当我打印'read'时,我得到的是:

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

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

3 个答案:

答案 0 :(得分:4)

首先使用csv module阅读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])

在读取CSV文件时,rows = [...]行使用list comprehension将每个最后一列转换为整数对象。

将行作为单独的列表,然后排序变得相对微不足道;只是排序或最后一列,这是key=lambda r: r[-1]位的作用。

演示:

>>> import csv
>>> demodata = '''\
... ANDERSON,Jane,7
... BIRCH,Darren,9
... MCKOLEEP,Philip,6
... SMITH,Richard,3
... '''
>>> reader = csv.reader(demodata.splitlines(True))
>>> rows = [r[:-1] + [int(r[-1])] for r in reader]
>>> rows.sort(key=lambda r: r[-1])
>>> for row in rows:
...     print row
... 
['SMITH', 'Richard', 3]
['MCKOLEEP', 'Philip', 6]
['ANDERSON', 'Jane', 7]
['BIRCH', 'Darren', 9]

答案 1 :(得分:1)

你可以这样使用:

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

答案 2 :(得分:1)

您可以尝试使用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']]