我正在尝试使用两个键构建一个字典,但在分配项目时遇到了KeyError。单独使用每个键时我没有收到错误,语法看起来非常简单,所以我很难过。
searchIndices = ['Books', 'DVD']
allProducts = {}
for index in searchIndices:
res = amazon.ItemSearch(Keywords = entity, SearchIndex = index, ResponseGroup = 'Large', ItemPage = 1, Sort = "salesrank", Version = '2010-11-01')
products = feedparser.parse(res)
for x in range(10):
allProducts[index][x] = { 'price' : products['entries'][x]['formattedprice'],
'url' : products['entries'][x]['detailpageurl'],
'title' : products['entries'][x]['title'],
'img' : products['entries'][x]['href'],
'rank' : products['entries'][x]['salesrank']
}
我不相信问题在于feedparser(将xml转换为dict)或者我从亚马逊获得的结果,因为当使用'allProducts [x]'或'时我没有问题构建dict allProducts [index]',但不是两者。
我错过了什么?
答案 0 :(得分:6)
为了分配给allProducts[index][x]
,首先在allProducts[index]
上进行查找以获取字典,然后您分配的值将存储在该字典中的索引x
。
然而,第一次通过循环时,allProducts[index]
尚不存在。试试这个:
for x in range(10):
if index not in allProducts:
allProducts[index] = { } # or dict() if you prefer
allProducts[index][x] = ...
由于您事先知道allProducts
中应该知道的所有索引,因此您可以事先将其初始化为:
map(lambda i: allProducts[i] = { }, searchIndices)
for index in searchIndices:
# ... rest of loop does not need to be modified
答案 1 :(得分:3)
如果您使用的是Python 2.5或更高版本,则会为collections.defaultdict
量身定制此类情况。
只需更换一行:
allProducts = {}
以下内容:
import collections
allProducts = collections.defaultdict(dict)
使用中的一个例子:
>>> import collections
>>> searchIndices = ['Books', 'DVD']
>>> allProducts = collections.defaultdict(dict)
>>> for idx in searchIndices:
... print idx, allProducts[idx]
...
Books {}
DVD {}
答案 2 :(得分:1)
您可以使用字典的setdefault方法。
for x in range(10):
allProducts.setdefault(index, {})[x] = ...
答案 3 :(得分:0)
你需要告诉python它是dict里面的一个字典。它不知道allProducts [index]应该是另一个字典。
每当你尝试这样做(或使用defaultdict)时,你需要添加这样的行:
allProducts = {}
for index in searchIndices:
allProducts[index] = {}
答案 4 :(得分:0)
searchIndices = ['Books', 'DVD']
allProducts = {}
for index in searchIndices:
res = amazon.ItemSearch(Keywords = entity, SearchIndex = index, ResponseGroup = 'Large', ItemPage = 1, Sort = "salesrank", Version = '2010-11-01')
products = feedparser.parse(res)
for x in range(10):
if not allProducts.has_key(index):
allProducts[index] = {}
allProducts[index][x] = { 'price' : products['entries'][x]['formattedprice'],
'url' : products['entries'][x]['detailpageurl'],
'title' : products['entries'][x]['title'],
'img' : products['entries'][x]['href'],
'rank' : products['entries'][x]['salesrank']
}