如何从嵌套在字典中的字典中打印所有内容

时间:2018-07-07 18:31:23

标签: python dictionary typeerror

shopItems = {
    "Item1":{
    "lvlReq":10,
    "Cost":100,
    "Stock":1},

    "Item2":{
    "lvlReq":20,
    "Cost":200,
    "Stock":2},
    }

for key in shopItems.iterkeys():
    print key,
    for items in shopItems[key]:
        print items,
        for values in shopItems[key][items]:
            print values

这给了我错误:TypeError:'int'对象不可迭代

我希望它打印出来:

  

Item1 lvlReq 10 Cost 100 Stock 1

     

Item2 lvlReq 20 Cost 200 Stock 2

4 个答案:

答案 0 :(得分:3)

不用问为什么,这是一种使用列表理解的方法:

for k,v in shopItems.items():
    print(' '.join([k]+[' '.join(map(str,i)) for i in v.items()]))

返回:

Item1 lvlReq 10 Cost 100 Stock 1
Item2 lvlReq 20 Cost 200 Stock 2

答案 1 :(得分:1)

比@AntonvBR优雅,但坚持使用代码设置...

   In [59]: shopItems = {
        ...:     "Item1":{
        ...:     "lvlReq":10,
        ...:     "Cost":100,
        ...:     "Stock":1},
        ...: 
        ...:     "Item2":{
        ...:     "lvlReq":20,
        ...:     "Cost":200,
        ...:     "Stock":2},
        ...:     }
        ...: 
        ...: for key in shopItems:
        ...:     print(key, end=' ')
        ...:     for items, values in shopItems[key].items():
        ...:         print(items, values, end=' ')
        ...:     print()
        ...:     
        ...:     
        ...:         
    Item1    lvlReq   10  Cost   100  Stock   1
    Item2    lvlReq   20  Cost   200  Stock   2

为python2编辑:

for key in shopItems:
    print key,
    for items, values in shopItems[key].items():
    print items, values,  
    print ""

答案 2 :(得分:1)

首先,让我们看一下现有代码的作用。

  • 每个key是一个顶级密钥,例如“ Item1”。
  • 因此shopItems[key]是这些内部命令之一,例如{“ lvlReq”:10,“ Cost”:100,“ Stock”:1}`。
  • 因此,每个items都是诸如lvlReq之类的内部字典之一的键。您应该从print items中看到这一点。
  • 因此,每个shopItems[key][items]都是诸如10之类的内部字典之一中的值。
  • 因此,每个values都是其中一个值的元素,例如...哎呀,10不是可迭代的,它没有没有任何元素。

因此,您只走了一步。


您要打印的是这些内部字典的键和值,对吗?

for key in shopItems.iterkeys():
    print key,
    for items in shopItems[key]:
        print items, shopItems[key][items],
    print

通过为这些变量提供与它们实际的名称相对应的名称,并在需要键和键值对时遍历键,可以使这一点更加清晰:

for itemname, itemdict in shopItems.iteritems():
    print itemname,
    for propname, propvalue in itemdict.iteritems():
        print propname, propvalue,
    print

无论哪种方式,您都会得到类似的东西:

Item2 Cost 200 lvlReq 20 Stock 2
Item1 Cost 100 lvlReq 10 Stock 1

当然,这与您想要的顺序不同,但这是因为字典没有任何固有的顺序。遍历字典总是可以按照给您感觉的顺序为您提供元素。

如果不能接受,则可能要使用OrderedDict而不是dict,或者可能要在某个地方致电sorted,或者可能要通过密钥您知道您想要的顺序是您想要的,而不是以任何顺序排列。例如(也许不是您想要的确切行为,但是您应该可以从这里弄清楚):

for itemname, itemdict in sorted(shopItems.iteritems()):
    print itemname,
    for propname in ('lvlReq', 'Cost', 'Stock'):
        print propname, itemdict[propname],
    print

现在行以排序顺序显示(因此Item1Item2之前,但是Item11Item2之前也是 …) ,并且各列始终按该顺序lvlReq Cost Stock相同。

答案 3 :(得分:-1)

尝试:

for key in shopItems:
    print(key, end=" ")
    for items in shopItems[key]:
        print(items, end=" ")
        print(shopItems[key][items], end=" ")
    print()