2016-01-25 76 views
3

我試圖解析來自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 

在該命令只包含一個產品的情況,其結果是這樣的:

for product in products['order_row']: 
    print product['product_reference'] 
{'product_id': '6', 'price': '39.000000', 'product_reference': '000001'} 

我的不能循環播放

因爲:

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 

我不知道如何解決它。唯一的問題是檢查字典深度,但我不知道它是否是一個好的解決方案。

+0

什麼是產品['product_reference']出錯了? – herokingsley

+1

爲什麼不把它添加到空列表incase的響應類型obj是字典?迭代按預期工作 –

+1

檢查數據類型-'isinstance(...,list)'或'isinstance(...,dict)'做不同的事情。 – furas

回答

3

在這三個對象的第一個例子中,給出了這三個字典的列表(注意:在列表中!),這樣您就可以像正常一樣遍歷每個字典。在第二個例子中,然而,這...

for product in products['order_row']: 

變成這樣...

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

...到不同的東西。因爲它不是一個列表,而且它是一本字典,所以你要將放入字典而不是列表中。你現在試圖得到'product_id'的索引,你需要[#s]來做這個索引,因爲它是一個字符串(例如獲得'r',你需要'product_id'[1]),並且你得到一個(Type)錯誤,因爲您提供了一個字符串。

的Python的方式做這將是預期的錯誤,抓住它,做別的事情:

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

或者,您可以添加字典到一個空列表作爲一個評論建議和您的for循環將遍歷整個該項目的列表。

+0

謝謝! 解列表: '如果不是isinstance(產品,列表): 產品= [產品] 產品在產品: 印刷產品[ 'product_reference']' 或使用try和除了: '請嘗試: 產品中的產品: 打印產品['product_reference'] 除TypeError: 打印產品['product_reference']' – user3041764