Python - цикл не работает, если только один элемент. 'TypeError: строковые индексы должны быть целыми числами' - PullRequest
0 голосов
/ 06 июля 2018

У меня есть следующий код, который запускается, если можно назначить Rank_Dict. Проблема заключается в том, что если Rank_Dict выглядит как пример A и имеет два набора значений, он отлично зацикливается, но если Rank_Dict имеет только одну пару значений, как в примере B, я получаю ошибку. Разве вы не можете перебрать результирующий набор, который может содержать только одно значение?

Ошибка:

File "product.py", line 116, in <module>
ProductCategoryId=ranking['ProductCategoryId']['value']
TypeError: string indices must be integers

Код:

try: 
   Rank_Dict=products_as_dict['Product']['SalesRankings']['SalesRank']
except:
  print("Didn't find Product/SalesRankings/SalesRank")
else:
  for ranking in Rank_Dict:
    ProductCategoryId=ranking['ProductCategoryId']['value']
    Rank=ranking['Rank']['value']   

Пример данных A - отлично зацикливается

[{'ProductCategoryId': {'value': 'home_improvement_display_on_website'}, 'Rank': {'value': '1335712'}},
{'ProductCategoryId': {'value': '17416540011'}, 'Rank': {'value': '2593'}}]

Пример B - не удается выполнить цикл

{'ProductCategoryId': {'value': 'home_improvement_display_on_website'}, 'Rank': {'value': '55928'}}

1 Ответ

0 голосов
/ 06 июля 2018

Дело в том, что это

[{'ProductCategoryId': {'value': 'home_improvement_display_on_website'}, 'Rank': {'value': '1335712'}},
 {'ProductCategoryId': {'value': '17416540011'}, 'Rank': {'value': '2593'}}]

- это list (заполненный объектами, являющимися словарями)

и это

{'ProductCategoryId': {'value': 'home_improvement_display_on_website'}, 'Rank': {'value': '55928'}}

это словарь.

Итак, вы сравниваете поведение циклического прохождения двух разных type объектов. Ясно, что есть место для ошибок ..

Есть несколько способов решения этой проблемы. Одним из них является только цикл, если у вас есть список , в противном случае просто работайте напрямую с объектом. В коде

import collections #Thanks @abarnet
try: 
   Rank_Dict=products_as_dict['Product']['SalesRankings']['SalesRank']
except:
  print("Didn't find Product/SalesRankings/SalesRank")
else:
  if isinstance(Rank_Dict, collections.abc.Sequence):
    for ranking in Rank_Dict:
      ProductCategoryId=ranking['ProductCategoryId']['value']
      Rank=ranking['Rank']['value']  
  else:
      ProductCategoryId= Rank_Dict['ProductCategoryId']['value']
      Rank= Rank_Dict['Rank']['value']  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...