让我们回顾一下 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')]