![](/img/trans.png)
[英]Sort alphanumeric excel file from highest to lowest using 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.