Python 用户输入作为嵌套字典的查询

Python 用户输入作为嵌套字典的查询,python,python-3.x,dictionary,Python,Python 3.x,Dictionary,我有一个嵌套的字典,而不是一个硬编码的查询来查询ownername John,我想提示用户输入一个名称,只是为了测试它,我在被提示时键入John,程序崩溃了,错误是字符串索引必须是整数 下面的代码运行良好,并返回Kitty John = { 1: {'name': 'Kitty', 'kind': 'cat'}, 2: {'name': 'Ruffle', 'kind': 'dog'}, 3: {'name': 'Bobby', 'kind':

我有一个嵌套的字典,而不是一个硬编码的查询来查询ownername John,我想提示用户输入一个名称,只是为了测试它,我在被提示时键入John,程序崩溃了,错误是字符串索引必须是整数

下面的代码运行良好,并返回Kitty

John = { 1:  {'name': 'Kitty',  'kind':  'cat'},
         2:  {'name': 'Ruffle', 'kind':  'dog'},
         3:  {'name': 'Bobby',  'kind': 'fish'}
       }

petownername = John[1]['name']
print(petownername)
当我将所有者的名字硬编码为John,并用f字符串输入字典查询时,这也可以很好地工作

John = { 1:  {'name': 'Kitty',  'kind': 'cat'},
         2:  {'name': 'Ruffle', 'kind': 'dog'},
         3:  {'name': 'Bobby',  'kind': 'fish'}
       }

owner_name = John

petname   = f"{owner_name[1]['name']}"
print(petname)
但是如上所述,当我添加新的用户输入时,它停止工作

John = { 1:  {'name': 'Kitty', 'kind': 'cat'},
         2:  {'name': 'Ruffle','kind': 'dog'},
         3:  {'name': 'Bobby',' kind': 'fish'}
       }

owner_name = str(input("Which pet owner do you want to look up?: "))


petname   = f"{owner_name[1]['name']}"
print(petname)
我得到这个错误:

Which pet owner do you want to look up?: John
Traceback (most recent call last):
  File "test3.py", line 9, in <module>
    petname   = f"{owner_name[1]['name']}"
TypeError: string indices must be integers
你想找哪个宠物主人?:约翰
回溯(最近一次呼叫最后一次):
文件“test3.py”,第9行,在
petname=f“{owner_name[1]['name']}”
TypeError:字符串索引必须是整数
所以,当我硬编码它并通过f字符串插入它时,它工作得很好,输入显然是一个字符串。你知道为什么它不能在用户提示下工作吗?
我是否需要以另一种方式存储并引用用户提示?

它不起作用,因为在第二个代码段中,
owner\u name
是一个dict,而在第三个代码段中它是一个字符串——具体地说是
owner\u name='John'
所以
owner\u name[1]='o'
,和
'o'['name']
引发
TypeError
。f字符串是不相关的

要修复它,请使用一个以上级别的嵌套dict。看

顺便说一句,您可能希望使用列表,而不是以int作为键的dict

pet_owners = {
    "John": [
        {'name': 'Kitty', 'kind': 'cat'},
        {'name': 'Ruffle', 'kind': 'dog'},
        {'name': 'Bobby',' kind': 'fish'},
        ]
    }

owner_name = input('Pet owner name: ')

petname = pet_owners[owner_name][0]['name']  # Note the 0 instead of 1
print(petname)
试运行:

宠物主人姓名:约翰
基蒂

另外,
str(input())
在Python 3中是多余的,因为
input()
返回一个字符串。

它不起作用,因为在第二个代码段中,
owner\u name
是一个dict,而在第三个代码段中它是一个字符串——特别是
owner\u name='John'
所以
owner\u name[1]='o'
,和
'o'['name']
引发了
TypeError
。f字符串是不相关的

若要修复此问题,请再使用一级嵌套dict。请参阅

顺便说一句,您可能希望使用列表,而不是以int作为键的dict

pet_owners = {
    "John": [
        {'name': 'Kitty', 'kind': 'cat'},
        {'name': 'Ruffle', 'kind': 'dog'},
        {'name': 'Bobby',' kind': 'fish'},
        ]
    }

owner_name = input('Pet owner name: ')

petname = pet_owners[owner_name][0]['name']  # Note the 0 instead of 1
print(petname)
试运行:

宠物主人姓名:约翰
基蒂

另外,
str(input())
在Python 3中是多余的,因为
input()
返回一个字符串。

当您执行
owner\u name=John
时,您将
owner\u name
设置为
dict
而不是字符串。当您请求用户输入时,现在
owner\u name
是字符串
“John”
,而不是您试图查看的
dict
。继续@RocketHazmat所说的,您可能需要另一个外部字典将所有者的名字映射到他们的字典。那么,为什么您在这里使用“f字符串”呢?您可以只做
petname=owner\u name[1]['name']
。我对它进行了硬编码,以确定f字符串是否有效。我已经证明,我可以使用petname=f“{owner_name[1]['name']}正确地使用f字符串但是为什么不使用用户的输入呢?我不想硬编码用户输入,因为我计划创建更多的一个用户。@ DEV然后考虑@ sSHIAKANK124的建议并创建一个包含所有用户的外部字典。例如:<代码>用户= {“约翰”:{ 1:{名字〉:‘Kitty’,‘At'’:‘猫’} }。。当您执行
owner\u name=John
操作时,您将
owner\u name
设置为
dict
而不是字符串。当您请求用户输入时,现在
owner\u name
是字符串
“John”
,而不是您试图查看的
dict
。继续@RocketHazmat所说的,您可能需要另一个外部字典将所有者的名字映射到他们的字典。那么,为什么您在这里使用“f字符串”呢?您可以只做
petname=owner\u name[1]['name']
。我对它进行了硬编码,以确定f字符串是否有效。我已经证明,我可以使用petname=f“{owner_name[1]['name']}正确地使用f字符串但是为什么不使用用户的输入呢?我不想硬编码用户输入,因为我计划创建更多的一个用户。@ DEV然后考虑@ sSHIAKANK124的建议并创建一个包含所有用户的外部字典。例如:<代码>用户= {“约翰”:{ 1:{名字〉:‘Kitty’,‘At'’:‘猫’} }//>。