【问题标题】:Unable to print a list of nested dict keys? [closed]无法打印嵌套字典键列表? [关闭]
【发布时间】:2016-04-24 09:24:47
【问题描述】:

我有一个看起来像这样的字典:

{'Tesco': [{'Parking': 'True', 'TrolleyHire': True,
  'Location': {'Address': {'BuildingName': 'Church Street',
             'BuildingNumber': '14', 'City' : 'London'}, 
  'Permit' = True},

基本上它是一个字典,其中的键包含一个列表形式的嵌套字典。

我想打印出上面第一个“Tesco”键中的所有嵌套键。

我试过了:

for key in dict:
for key2 in dict[key]:
    print (key2.keys())

但是我不断收到 AttributeError: 'str' object has no attribute 'keys'。

上面的键包含 Tesco 键和另一个键。

上面的 key2 包含与 Tesco 键关联的字典(键/值对)列表。

key2.keys() 应该提供与该字典关联的键列表,但它似乎不太有效!

我不想要一个函数来为我做这件事。

显然这是一个非常简单的解决方案,但我就是想不通。 我确实花了 5 个小时在这上面,现在我正式放弃了,因为它看起来应该非常简单:(

【问题讨论】:

  • 您发布的不是有效的 python 字典。请做一个实际运行的例子。

标签: python json dictionary


【解决方案1】:

它对我有用:

dict = {
 'Tesco': [{'Parking': 'True', 'TrolleyHire': True,
 'Location': {'Address': {'BuildingName': 'Church Street',
 'BuildingNumber': '14', 'City' : 'London'}, 
 'Permit': True}}]
}

for key in dict:
    for key2 in dict[key]:
        print (key2.keys())

打印出来:

dict_keys(['Location', 'Parking', 'TrolleyHire'])

这绝对是您使用的字典吗?我不得不在最后添加一些东西来完成它。

编辑:看到您的原始代码后。

正如你所说,JSON 正在创建一个带有两个键的字典——Scheme 和 ChargeDevice。您遍历这些键中的每一个。

那么在第一次通过时,key 等于 "Scheme"

然后你说for key2 in data[key],它获取与“Scheme”关联的字典并遍历其键。

问题在于 key2 将始终表示一个键字符串 - 字符串没有键,只有 dicts 有。例如,key2 将采用值“SchemeCode”,它是一个字符串,并且您正在调用 key2.keys() - 并且字符串没有 keys() 方法,因此出现错误。你可能只想要print(key2)

编辑 2

我不确定我是否完全理解您的需求,但以下将在主字典的第二级打印一个键列表,不重复。

key_names = []
for key in data:
    for key2 in data[key]:
        if type(key2) == str and key2 not in key_names:
            key_names.append(key2)
        elif type(key2) == dict:
            for key3 in key2.keys():
                if key3 not in key_names:
                    key_names.append(key3)
print(key_names)

如果你想任意深入,我认为你需要使用一个递归调用自身的函数。

【讨论】:

  • 嗯,我不断收到:AttributeError: 'str' object has no attribute 'keys' on print (key2.keys())
  • 奇怪的是,我很确定这完全符合昨天的预期。相同的字典,没有任何改变。
  • 您输入问题的字典不能是您正在使用的字典,因为它末尾缺少大括号,并且语法错误。如果您从代码中粘贴实际的字典,它可能会变得更清楚。
  • 我使用的实际 dict 来自一个 json 文件,我使用 json.loads chargepoints.dft.gov.uk/api/retrieve/registry/format/json 将其加载到名为 data 的变量中。它有超过 3000 行,这就是为什么我不能发布完整的东西,只是一个 sn-p
  • 您是否使用了该 JSON 中表示的整个对象?我尝试这样做并得到KeyError: 'Scheme' - 大概你正在使用它的一个小节?只是想重现你原来的错误:)
【解决方案2】:

只使用 .values() 可能更优雅:

for sub_list in dict.values():
    for sub_dict in sub_list:
        print(sub_dict.keys())

【讨论】:

  • 仍然得到:AttributeError: 'str' object has no attribute 'keys' on last line
  • 你能用实际使用的字典更新你的问题吗?这对我来说很好
  • 查看我对 Sam 所做的评论。使用 tobspr 的代码时出现同样的错误。
猜你喜欢
  • 2021-12-06
  • 2021-05-10
  • 2020-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-09
相关资源
最近更新 更多