如果只有一项,Python-For循环将失败';TypeError:字符串索引必须是整数';

如果只有一项,Python-For循环将失败';TypeError:字符串索引必须是整数';,python,for-loop,Python,For Loop,我有下面的代码,如果能够分配Rank_Dict,它将运行。问题是,如果Rank_Dict看起来像示例A,并且有两组值,那么它会很好地循环,但是如果Rank_Dict只有一对值,比如示例B,那么我会得到一个错误。不能循环处理只能包含一个值的结果集吗 错误: File "product.py", line 116, in <module> ProductCategoryId=ranking['ProductCategoryId']['value'] TypeError: string i

我有下面的代码,如果能够分配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
数据示例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'}}
问题是

[{'ProductCategoryId': {'value': 'home_improvement_display_on_website'}, 'Rank': {'value': '1335712'}},
 {'ProductCategoryId': {'value': '17416540011'}, 'Rank': {'value': '2593'}}]
是一个
列表
(填充的对象恰好是字典)

还有这个

{'ProductCategoryId': {'value': 'home_improvement_display_on_website'}, 'Rank': {'value': '55928'}}
这是一本字典

因此,您正在比较通过两种不同类型的对象循环的行为。很明显,有犯错的余地

有几种方法可以解决这个问题。其中一个方法是只有在有列表的情况下才循环,否则直接使用对象即可。在代码中

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']  
问题是

[{'ProductCategoryId': {'value': 'home_improvement_display_on_website'}, 'Rank': {'value': '1335712'}},
 {'ProductCategoryId': {'value': '17416540011'}, 'Rank': {'value': '2593'}}]
是一个
列表
(填充的对象恰好是字典)

还有这个

{'ProductCategoryId': {'value': 'home_improvement_display_on_website'}, 'Rank': {'value': '55928'}}
这是一本字典

因此,您正在比较通过两种不同类型的对象循环的行为。很明显,有犯错的余地

有几种方法可以解决这个问题。其中一个方法是只有在有列表的情况下才循环,否则直接使用对象即可。在代码中

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']  

如果有一个项,如果Len(Rank_Dict)为1@arunp9294这不是一个好方法,您可以使用
len()
1创建
dict
,使用
len()
1创建
列表。仍然模棱两可:)要问的第一个问题是这些数据来自哪里。如果它是由您编写的代码生成的,或者通过JSON从工作时坐在您对面的人编写的服务中解析出来的,等等,最简单的方法是修复数据,使其始终是一个dict列表,而不是有时是一个dict,有时是一个dict列表。如果有一个条目,则将其转换为数组,如果是Len(Rank_dict)是1@arunp9294这不是一个好方法,您可以使用
len()
1创建
dict
,使用
len()
1创建
列表。仍然模棱两可:)要问的第一个问题是这些数据来自哪里。如果它是由您编写的代码生成的,或者通过JSON从工作时坐在您对面的人编写的服务中解析出来的,等等,最简单的方法是修复数据,使其始终是一个dict列表,而不是有时是dict,有时是dict列表。除非这些数据来自,比如说JSON,所以我们知道
list
dict
是唯一可能的类型,我会在这里使用
collections.abc.Sequence
而不是
list
。除非这些数据来自JSON,否则我们知道
list
dict
是唯一可能的类型,我会在这里使用
collections.abc.Sequence
而不是
list