python-一次元辞書をループする

Prestashop APIからの結果を解析しようとしています。そのコードを用意しました。

prestashop = PrestaShopWebServiceDict( URL, API_KEY )

def get_order(order_id):
    orders = order_id.split(",")
    for order in orders:
        order = prestashop.get('orders', order)['order']
        for product in products['order_row']:
            print product['product_reference']

注文がいくつかの製品に関連付けられている場合、適切に機能し、結果は次のようになります。

[
    {'product_id': '6', 'price': '39.000000', 'product_reference': '000001'},
    {'product_id': '7', 'price': '38.000000', 'product_reference': '000002'},
    {'product_id': '8', 'price': '37.000000', 'product_reference': '000003'},
]

result:
000001 000002 000003

注文に製品が1つしか含まれていない場合、結果は次のようになります。

{'product_id': '6', 'price': '39.000000', 'product_reference': '000001'}

私はそれをループすることはできません:

for product in products['order_row']:
    print product['product_reference']

なぜなら:

Traceback (most recent call last):
  File "prestapyt_dict.py", line 30, in <module>
    print product['product_reference']
TypeError: string indices must be integers, not str

私はそれを解決する方法がわかりません。頭に浮かぶのは辞書の深さをチェックすることだけですが、それが良い解決策かどうかはわかりません。

ベストアンサー
3つのオブジェクトの最初の例では、3つの辞書のリスト(注:リスト内にあります!)が与えられているので、通常のように各辞書をループできます。ただし、2番目の例では、これは…

for product in products['order_row']:

これを変える…

{'product_id': '6', 'price': '39.000000', 'product_reference': '000001'}

…何か違うものに。これはリストではなく、1つの辞書であるため、リストではなく辞書を使用します。あなたは今、 ‘product_id’のインデックスを取得しようとしています。これは文字列であるため[#s]が必要です(たとえば、 ‘r’を取得するには ‘product_id’ [1]が必要です)。代わりに文字列を提供するため、(タイプ)エラー。

これを行うためのPythonの方法は、エラーを予期してキャッチし、他のことをすることです:

try:
    for product in products['order_row']:
        print product['product_reference']
except TypeError:
    #something else

または、コメントの1つで提案されているように、空のリストに辞書を追加できます。forループは、その1つのアイテム全体についてそのリストをループします。

転載記事の出典を記入してください: python-一次元辞書をループする - コードログ