簡體   English   中英

在 python 中對 txt 文件進行排序時,字符串索引超出范圍

[英]string index out of range when sorting txt file in 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()

我收到錯誤'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

我該如何解決?

讓我們回顧一下 operator.itemgetter() 是如何工作的——假設你有一個這樣的元組列表——

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

如果我 select operator.itemgetter(0)。 這意味着我想要元組中的第一個值。 這個 function 可以通過以下方式映射到列表 -

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

您現在可以使用 0 或 1 排序的 function。這是完整的代碼 -

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)

與 output -

[('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(逗號分隔值),您應該逐行讀取它,然后以逗號分隔每一行:

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)

我建議您閱讀有關stripsplitopenreadlines的文檔,並在每個操作之間打印數據以了解該過程。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM