Python 遍历列表中的键时出错

Python 遍历列表中的键时出错,python,dictionary,keyerror,Python,Dictionary,Keyerror,大家好,我写了一个类似这样的函数 def solve_one_shop(shop, items): if len(items) == 0: return [0.0, []] all_possible = [] first_item = items[0] print shop['burger'] for (price,combo) in shop[first_item]: # DO SOMETHING # s

大家好,我写了一个类似这样的函数

def solve_one_shop(shop, items):
    if len(items) == 0:
        return [0.0, []]
    all_possible = []
    first_item = items[0]
    print shop['burger']
    for (price,combo) in shop[first_item]:
        # DO SOMETHING
        #

solver(shop_text,['burger'])
我尝试迭代的字典是:

{'1': {'burger': [[4.0, ['burger']]], 'tofu_log': [[8.0, ['tofu_log']]]}, '3': {'chef_salad': [[4.0, ['chef_salad']]], 'steak_salad_sandwich': [[8.0, ['steak_salad_sandwich']]]}, '2': {'burger': [[5.0, ['burger']]], 'tofu_log': [[6.5, ['tofu_log']]]}, '5': {'extreme_fajita': [[4.0, ['extreme_fajita']]], 'fancy_european_water': [[8.0, ['fancy_european_water']]]}, '4': {'wine_spritzer': [[2.5, ['wine_spritzer']]], 'steak_salad_sandwich': [[5.0, ['steak_salad_sandwich']]]}, '6': {'extra_salsa': [[6.0, ['extreme_fajita', 'jalapeno_poppers', 'extra_salsa']]], 'jalapeno_poppers': [[6.0, ['extreme_fajita', 'jalapeno_poppers', 'extra_salsa']]], 'extreme_fajita': [[6.0, ['extreme_fajita', 'jalapeno_poppers', 'extra_salsa']]], 'fancy_european_water': [[5.0, ['fancy_european_water']]]}}
问题是第6行给出了keyrerror(shop[第一项])

[[4.0,['burger']]
回溯(最近一次呼叫最后一次):
文件“working.py”,第58行,在
解算器(shop_text,['burger'])
文件“working.py”,第44行,在解算器中
(价格、解决方案)=解决一个店铺(店铺信息、所需物品)
文件“working.py”,第29行,在solve_one_shop中
对于商店中的(价格、组合)。获取(第一项):
TypeError:“非类型”对象不可编辑
为了克服这个错误,我尝试了硬编码,例如,如果我将第一个项目硬编码为
shop['burger']
(以及单引号),那么代码就会运行

但是如果我把它写成
shop[burger]
,那么它会抛出同样的
keyrerror:“burger”

如您所见,
print shop['burger']
输出密钥的可用性
'burger'
,但为什么会出现密钥错误


如何解决此问题?

您正试图从
目录
(此处
商店
)访问一个不存在的密钥。因此出现了错误。检查您的
dict
中是否存在该键
第一项
。您将不会得到此错误(更新的答案)

或者使用
try:except:

   ...
    try:
        for (price,combo) in shop[first_item]:
    except KeyError: 
        print 'ERROR: key not found!'
    ...

您正试图从
dict
(此处
shop
)访问一个不存在的密钥。因此出现了错误。检查您的
dict
中是否存在该键
第一项
。您将不会得到此错误(更新的答案)

或者使用
try:except:

   ...
    try:
        for (price,combo) in shop[first_item]:
    except KeyError: 
        print 'ERROR: key not found!'
    ...

您正试图从
dict
(此处
shop
)访问一个不存在的密钥。因此出现了错误。检查您的
dict
中是否存在该键
第一项
。您将不会得到此错误(更新的答案)

或者使用
try:except:

   ...
    try:
        for (price,combo) in shop[first_item]:
    except KeyError: 
        print 'ERROR: key not found!'
    ...

您正试图从
dict
(此处
shop
)访问一个不存在的密钥。因此出现了错误。检查您的
dict
中是否存在该键
第一项
。您将不会得到此错误(更新的答案)

或者使用
try:except:

   ...
    try:
        for (price,combo) in shop[first_item]:
    except KeyError: 
        print 'ERROR: key not found!'
    ...

如果您想以更安全的方式访问python中的字典键,我建议使用
get
方法。例如:

shop.get(first_item, False)
其中,第二个参数是字典不包含您试图访问的项时的默认返回值

正如Jon指出的,你也可以这样做:

shop.get(first_item, [])

如果您的字典不包含该键,则迭代将停止。

如果您希望以更安全的方式在python中访问字典键,我建议使用
get
方法。例如:

shop.get(first_item, False)
其中,第二个参数是字典不包含您试图访问的项时的默认返回值

正如Jon指出的,你也可以这样做:

shop.get(first_item, [])

如果您的字典不包含该键,则迭代将停止。

如果您希望以更安全的方式在python中访问字典键,我建议使用
get
方法。例如:

shop.get(first_item, False)
其中,第二个参数是字典不包含您试图访问的项时的默认返回值

正如Jon指出的,你也可以这样做:

shop.get(first_item, [])

如果您的字典不包含该键,则迭代将停止。

如果您希望以更安全的方式在python中访问字典键,我建议使用
get
方法。例如:

shop.get(first_item, False)
其中,第二个参数是字典不包含您试图访问的项时的默认返回值

正如Jon指出的,你也可以这样做:

shop.get(first_item, [])

如果你的字典不包含该键,迭代将停止。

是的,如果你使用
[]
作为默认值(而不是
False
),那么
for
循环将按原样工作,或者实际上是一个不可操作的循环…@JonClements谢谢你的提及,补充道。斯莱特编辑了这篇文章来澄清我的要求。请帮我一下。再次感谢。@sunita您正在调用
solver
,但您的函数名为
solve\u one\u shop
-确保您的代码在您的问题中是正确的,因为它会混淆您实际试图运行的内容和实际运行的内容……是的,如果您使用
[]
作为默认值(而不是
False
)然后的
循环将按原样工作,或者实际上是一个不可操作的循环…@JonClements谢谢你的提及,补充道。斯莱特我编辑了这篇文章来澄清我的要求。请帮我一下。再次感谢。@sunita您正在调用
solver
,但您的函数名为
solve\u one\u shop
-确保您的代码在您的问题中是正确的,因为它会混淆您实际试图运行的内容和实际运行的内容……是的,如果您使用
[]
作为默认值(而不是
False
)然后
循环将按原样工作,或者实际上是一个不可操作的循环…@JonClements谢谢你的提及,补充道。斯莱特我编辑了这篇文章来澄清我的要求。请帮我一下。再次感谢。@sunita您正在调用
solver
,但您的函数名为
solve\u one\u shop
-确保您的代码在您的问题中是正确的,因为它会混淆您实际试图运行的内容和实际运行的内容……是的,如果您使用
[]
作为默认值(而不是
False
)然后
循环将按原样工作,或者实际上是一个不可操作的循环…@JonClements谢谢你的提及,补充道。斯莱特我编辑了这篇文章来澄清我的要求。请帮我一下。再次感谢。@sunita您正在调用
solver
,但您的函数名为
solve\u one\u shop
——请确保您的代码在您的问题中是正确的,因为它会混淆您的实际情况