-1

我有一个包含 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 = sorted(car_content, key = operator.itemgetter(1), reverse=True)

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

如果我改变

key = operator.itemgetter(0)

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

文件链接:https ://drive.google.com/file/d/1HW7zhGKVTHYLs4SrdQ1XMrc3k01BA3nT/view?usp=sharing

我该如何解决?

4

2 回答 2

0

让我们回顾一下 operator.itemgetter() 是如何工作的——假设你有一个这样的元组列表——

list1 = [(1,2,3),
        (4,5,6)]

如果我选择 operator.itemgetter(0)。这意味着我想要元组中的第一个值。这个函数可以通过 - 映射到一个列表

#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() 

当您像这样读取文件内容时。列表 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']

operator.itemgetter(1) 不适用于上述列表,因为列表中的每个项目都包含 1 个通过 ',' 分隔的单个字符串,这就是错误列表索引超出范围的原因。

现在,您需要做的是将这个列表拆分为 ',' -

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

您现在可以将 sorted 函数与 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')]
于 2021-04-13T08:08:06.873 回答
0

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

with open("Mileage.txt.txt", "r") as f:
  data = f.readlines()

data = [line.strip().split(",") for line in data]
data = [(line[0], float(line[1])) for line in data]

然后,您可以对元组列表进行排序:

data.sort(key=lambda item: item[1], reverse=True)

我建议您阅读 、 和 的文档,strip并在每个操作之间打印数据以了解该过程。splitopenreadlines

于 2021-04-13T08:38:22.127 回答