在我的程序中,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']
相反,我希望列表按每个项目中的整数排序,而不是按字母顺序排序。
答案 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']]