-4
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

4

4 回答 4

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
于 2018-07-07T18:45:26.283 回答
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 ""
于 2018-07-07T18:48:54.530 回答
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

当然,这与您想要的顺序不同——但那是因为字典没有任何固有的顺序;遍历字典总是以任何感觉给你的顺序给你元素。

如果这不可接受,您可能想要使用 anOrderedDict而不是 a dict,或者您可能想要在sorted某个地方调用,或者您可能想要按照您想要它们的顺序遍历您知道您想要的密钥,而不是按任何顺序排列的任何内容. 例如(也许不是您想要的确切行为,但您应该能够从这里弄清楚):

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

现在,行以排序顺序显示(Item1之前也是Item2如此——但 thenItem11也是在……之前),并且列在该顺序中始终相同。Item2lvlReq Cost Stock

于 2018-07-07T18:54:36.337 回答
-1

尝试:

for key in shopItems:
    print(key, end=" ")
    for items in shopItems[key]:
        print(items, end=" ")
        print(shopItems[key][items], end=" ")
    print()
于 2018-07-07T18:51:36.710 回答