在python中对txt文件排序时字符串索引超出范围

在python中对txt文件排序时字符串索引超出范围,python,Python,我有一个包含2列的txt文件,第一列是汽车名称,第二列是每小时使用的加仑数,我尝试用第二列值按降序排序,代码如下: import operator car = open('Mileage.txt', 'r') car_content = car.read() sorted_content = sorted(car_content, key = operator.itemgetter(1), reverse=True) print(car_content) car.close() 我收到一个错误

我有一个包含2列的txt文件,第一列是汽车名称,第二列是每小时使用的加仑数,我尝试用第二列值按降序排序,代码如下:

import operator
car = open('Mileage.txt', 'r')
car_content = car.read()
sorted_content = sorted(car_content, key = operator.itemgetter(1), reverse=True)
print(car_content)
car.close()
我收到一个错误 'sorted_content=sortedcar_content,key=operator.itemgetter1,reverse=True

索引器:字符串索引超出范围'

如果我改变主意

key = operator.itemgetter(0)

它可以工作,但只打印文件,而不进行降序

文件链接:


如何修复它?

让我们回顾一下operator.itemgetter的工作原理- 假设你有一个这样的元组列表-

list1 = [(1,2,3),
        (4,5,6)]
如果我选择operator.itemgetter0。这意味着我需要元组中的第一个值。此功能可以通过映射到列表-

#map
print(list(map(operator.itemgetter(0), list1))) #
#list comprehension
print([operator.itemgetter(1)(val) for val in list1])
第一个将打印-[1,4] 第二个将打印-[2,5]

关于文件阅读的几点建议-

使用上下文管理器打开文件。它将在读取后自动关闭文件。 文件中的行将包含换行符“\n”。你可能想脱光衣服

with open('Mileage.txt', 'r') as car:
    car_content = car.read().splitlines() 
当你像这样读文件内容时。列表内容将包含字符串列表-

['Prius,2.1', 'Camry,4.1', 'Sebring,4.2', 'Mustang,5.3 ', 'Accord,4.1', 'Camry,3.8', 'Camry,3.9', 'Mustang,5.2', 'Accord,4.3', 'Prius,2.3', 'Camry,4.2', 'Accord,4.4']
operator.itemgetter1不会在上面的列表中工作,因为列表中的每个项都包含一个通过“,”分隔的字符串,这就是为什么错误列表索引超出范围的原因

现在,您需要做的是在“,”上拆分此列表-

car_content = [tuple(car.split(',')) for car in car_content]
这将为您提供元组列表-

[('Prius', '2.1'),
('Camry', '4.1'),
('Sebring', '4.2'),
('Mustang', '5.3 '),
('Accord', '4.1'),
('Camry', '3.8'),
('Camry', '3.9'),
('Mustang', '5.2'),
('Accord', '4.3'),
('Prius', '2.3'),
('Camry', '4.2'),
('Accord', '4.4')]
现在可以将排序函数与0或1一起使用。 这是完整的代码-

import operator
with open('test.txt', 'r') as car:
    car_content = car.read().splitlines()  
car_content = [tuple(car.split(',')) for car in car_content]
sorted_content = sorted(car_content, key = operator.itemgetter(1), reverse=True)
print(sorted_content)
有输出-

[('Mustang', '5.3 '),
('Mustang', '5.2'),
('Accord', '4.4'),
('Accord', '4.3'),
('Sebring', '4.2'),
('Camry', '4.2'),
('Camry', '4.1'),
('Accord', '4.1'),
('Camry', '3.9'),
('Camry', '3.8'),
('Prius', '2.3'),
('Prius', '2.1')]

您首先需要将数据格式化为行和列,这里您只是将文件作为一个字符串读取。您的文件数据结构是CSV逗号分隔值,您应该逐行读取,然后以逗号分隔每行:

使用openMileage.txt.txt,r作为f: 数据=f.readlines 数据=[line.strip.split,用于数据中的行] 数据=[line[0],floatline[1]表示数据中的行] 然后可以对元组列表进行排序:

data.sortkey=lambda item:item[1],reverse=True
我建议您阅读剥离、拆分、打开和读取行的文档,并在每次操作之间打印数据,以了解流程。

同时提供文件当您执行car\u content=car.read时,您希望car\u内容最终会是什么?看起来您需要一个列表列表,其中每个子列表都有两个与文件行中的列相对应的项。但是那怎么行。阅读不是魔法。还有:pycharm是你的编辑;它对代码的运行方式没有影响,只是一个用来帮助编写代码的工具。我从你的问题中删除了标签和信息,因为它们不相关;对于如何使用程序本身的问题,例如如何告诉它使用哪个版本的Python,如何快速缩进代码等,您应该提出这个问题,但只打印文件而不降低文件的降序。我不明白这是什么意思。你认为降档意味着什么?这回答了你的问题吗?您好,谢谢您的解释,但文件是这样的:问题不在于OP对itemgetter的理解;问题在于OP对如何读取和解析文件内容的理解。。。在我的代码里?但是我犯了一些错误,问题是您读取的数据没有行,也没有列值,因为您没有做任何解释内容的工作。这只是一个字符串。我已经对ans@evenevaa进行了更改