0

こんにちは、私はこのような関数を書きました

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 行目で KeyError ( shop[first_item] ) が発生していることです。

[[4.0, ['burger']]]
Traceback (most recent call last):
  File "working.py", line 58, in <module>
    solver(shop_text,['burger'])
  File "working.py", line 44, in solver
    (price, solution) = solve_one_shop(shop_info, required_items)
  File "working.py", line 29, in solve_one_shop
    for (price,combo) in shop.get(first_item):
TypeError: 'NoneType' object is not iterable

このエラーを克服するために、ハードコーディングを試みました。たとえば、first_item をshop['burger'] (一重引用符と共に)としてハードコーディングすると、コードが実行されます。

しかし、私がそれを と書くとshop[burger]、同じものがスローされますKeyError: 'burger'

ご覧のとおりprint shop['burger']、 はキーの可用性を出力します'burger'が、なぜ KeyError.

これを修正する方法は?

4

2 に答える 2

5

Python で辞書キーにアクセスするより安全な方法が必要な場合は、getメソッドを使用することをお勧めします。例えば:

shop.get(first_item, False)

2 番目の引数は、アクセスしようとしている項目が辞書に含まれていない場合のデフォルトの戻り値です。

Jon が指摘したように、次のようなこともできます。

shop.get(first_item, [])

辞書にそのキーが含まれていない場合、反復は停止します。

于 2014-03-25T11:36:47.213 に答える
-1

dict(こちら)からキーにアクセスしようとしていますが、shop存在しません。したがって、エラー。そのキーfirst_itemがに存在するかどうかを確認してくださいdict。このエラーは発生しません(更新された回答)。

...
if first_item in shop:
    for (price,combo) in shop[first_item]:
        ...

または使用try: except:

   ...
    try:
        for (price,combo) in shop[first_item]:
    except KeyError: 
        print 'ERROR: key not found!'
    ...
于 2014-03-25T11:34:06.810 に答える