【问题标题】:Python List Index Ouf Of Range In IF StatementIF语句中的Python列表索引超出范围
【发布时间】:2020-05-19 07:34:46
【问题描述】:

所以我有多个患者的信息存储在 database.txt 中,我想将文件中的数据检索到一个列表中。

并且系统提示输入患者id,以搜索并显示患者的其他信息,如姓名、年龄、组别和区域。

但是,我从第 12 行收到错误,但第 17 行中的类似语法能够毫无问题地运行。

search_keyword = input() # Asks for patient's name or id  (either one)
with open("database.txt", "r") as database:
     for data in database:
         for patients in data.split('|'):
             patient_details = []
             for details in patients.split(','):
                 patient_details.append(details)
             print(patient_details) # test
             print(len(patient_details) # test
             print(patient_details.index('Patient001')) # test
             print(patient_details[4]) # test
             if search_keyword == patient_details[0] or search_keyword == patient_details[4]: # error occured here, where it says list index out of range.
                        print("Name: " + patient_details[0])
                        print("Age: " + patient_details[1])
                        print("Group: " + patient_details[2])
                        print("Zone: " + patient_details[3])
                        print("ID: " + patient_details[4]) # no error here, patient_details[4] is able to display patient's id

数据库.txt

John,18,A,1,Patient001|Nick,20,F,9,Patient002

第 8,9,10 和 11 行的测试命令:

Line 8: [John, 18, A, 1, Patient001]
Line 9: 5
Line 10: 4
Line 11: IndexError: list index out of range

有人可以解释为什么会发生这种情况,以及在不使用任何导入模块的情况下有关此问题的任何解决方案吗?感谢您的帮助。

【问题讨论】:

  • 尝试在if 语句之前打印patient_details。您的数据点可能不是您所期望的。
  • 感谢您的回复!我通过在 IF 语句之前添加 print(patient_details) 对其进行了测试,结果将是 [John,18,A,1,Patient001],这是我正在寻找的完美列表,索引 [4] 作为患者ID。但我还必须将 IF 语句更改为 search_keyword == patient_details[0],因为 patient_details[4] 会引发错误。
  • 我不确定为什么在 IF 语句之前打印出来的列表是完美的,但是在 IF 语句的下一行使用它时会抛出一个索引列表超出范围错误。

标签: python list file indexing


【解决方案1】:

Imo 是 named tuple: 的一个非常好的用例

from collections import namedtuple

text = "John,18,A,1,Patient001|Nick,20,F,9,Patient002"

# build database
Patient = namedtuple('Patient', ['name', 'age', 'group', 'zone', 'id'])
db = [Patient(*patient) for entry in text.split("|") for patient in [entry.split(",")]]

# Asks for patient's id
search_keyword = input("Please give an ID: ") 

# query the database
result = [patient for patient in db if patient.id == search_keyword]
# or patient.id.startswith(), etc.

print(result)

没有任何导入的模块,你可以使用

text = "John,18,A,1,Patient001|Nick,20,F,9,Patient002"

# build database
db = [entry.split(",") for entry in text.split("|")]

search_keyword = input("Please give an ID: ") # Asks for patient's id

# query the database
result = [patient for patient in db if patient[4] == search_keyword]
print(result)

【讨论】:

  • 谢谢你的回答,我去看看!可悲的是,我不允许为我的初学者项目导入外部模块。
  • @Wesley:这只是一种方便,你完全可以不用命名元组。
【解决方案2】:

我发现代码中没有任何缺陷。虽然,我可以指出一些优化它的方法:

patient_details = dict()
with open("database.txt", "r") as database:
    for data in database:
        for patients in data.split('|'):
            patients = patients.split(',')
            patient_details[patients[4]] = patients[0:4]

search_keyword = input() # Asks for patient's id
if patient_details.get(search_keyword, None):
    patient_detail = patient_details[search_keyword]
    print("Name: " + patient_detail[0])
    print("Age: " + patient_detail[1])
    print("Group: " + patient_detail[2])
    print("Zone: " + patient_detail[3])
    print("ID: " + search_keyword)

使用地图而不是线性搜索可以让您进行最佳搜索。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-04-25
    • 2023-02-18
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多