在Python中构建多维字典时的KeyError

时间:2011-02-07 21:18:48

标签: python dictionary multidimensional-array

我正在尝试使用两个键构建一个字典,但在分配项目时遇到了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]',但不是两者。

我错过了什么?

5 个答案:

答案 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'] 
                                }