繁体   English   中英

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

[英]How to sort alphanumeric lists, by highest to lowest (Python)

在我的程序中,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模块读取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 = [...]行使用列表推导将最后一列转换为整数对象。

将行作为单独的列表,然后排序变得相对琐碎; 只是排序或最后一列,这就是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]

您可以这样使用sth:

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']]

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM