【问题标题】:How do I print everything from a dictionary nested in a dictionary如何打印嵌套在字典中的字典中的所有内容
【发布时间】:2018-12-15 23:32:12
【问题描述】:
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' object is not iterable

我希望它打印出来:

Item1 lvlReq 10 成本 100 库存 1

Item2 lvlReq 20 成本 200 库存 2

【问题讨论】:

  • 您有三个嵌套循环,而您的数据“深度”只有两个级别。
  • 好吧,如果我删除值,它只显示“item1 cost lvlreq stock item2 cost lvlreq stock
  • 你可以看到循环打印第二级键(例如成本),然后哪个变量保存这些值?如何使用它来打印值(例如 100)?

标签: python dictionary typeerror


【解决方案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 ""

【讨论】:

  • 它的 python 2.7 来自 print 的 OPs 用法 - 你的很好,但是 3.x
  • 至少我不是唯一一个怀念它的人...... :-s
  • 你的 Python2 代码试图重复 , 已经完成的所有“软空间”魔法,这意味着代码比它需要的更复杂,并且到处都有额外的空格.
【解决方案2】:

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

  • 每个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 之前,但Item11 Item2...之前),并且列始终相同lvlReq Cost Stock 按此顺序。

【讨论】:

    【解决方案3】:

    试试:

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

    【讨论】:

      【解决方案4】:

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

      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
      

      【讨论】:

      • 确实……抱歉。使用 python2 并打印不需要的 () 时,我的打印总是让我感到困惑。你的打印不会。打算调查一下
      猜你喜欢
      • 2018-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-02-13
      • 1970-01-01
      • 2022-12-03
      • 2021-12-11
      相关资源
      最近更新 更多