将嵌套dict的值赋给python

时间:2017-12-30 20:08:38

标签: json python-3.x dictionary nested

我有一个JSON对象列表的文件。它看起来像这样:

[
  {
    "id": 748,
    "location": {
      "slug": "istanbul",
      "parent": {
        "id": 442,
        "slug": "turkey"
      }
    },
    "rank": 110
  },
  {
    "id": 769,
    "location": {
      "slug": "dubai",
      "parent": {
        "id": 473,
        "slug": "uae"
      }
    },
    "rank": 24
  }
]

我想创建一个酒店父名称列表,所以我写这个代码来做这个,我读了JSON文件并将它分配给一个变量,那部分是正确的。但看看这段代码:

with open('hotels.json', 'r', encoding="utf8") as hotels_data:
    hotels = json.load(hotels_data)

parents_list = []
for item in hotels:
    if item["location"]["parent"]["slug"] not in parents_list:
        parents_list.append(item["location"]["parent"])

当我运行此代码时,我给出了这个错误:

if item["location"]["parent"]["slug"] not in parents_list:
TypeError: 'NoneType' object is not subscriptable

这段代码不起作用,所以我尝试打印JSON对象,所以我在循环中写了这个:

print(item["location"]["parent"]["slug"])

此代码打印我想要的值,但也给我完全相同的错误。 感谢您的任何帮助。

2 个答案:

答案 0 :(得分:1)

我尝试运行代码,它似乎与您的数据集一起正常工作。

但是,我只是为您的数据集hotels = [...]指定了酒店,而不是打开文件来读取数据。

我得到的结果是:

[{'id': 442, 'slug': 'turkey'}, {'id': 473, 'slug': 'uae'}]

如果您打印hotels,结果如何,是否与您在此处显示的相同?

如果您的数据集中实际上有更多数据,那么我可以假设某些词典不包含item["location"]["parent"]["slug"]。如果是这种情况,您应该先跳过这些元素,然后先检查每个item中是否存在该元素,然后再从parents_list读取。

例如:

try:
    item["location"]["parent"]["slug"]
except (KeyError, TypeError) as e:
    pass
else:
    if item["location"]["parent"]["slug"] not in parents_list:
        parents_list.append(item["location"]["parent"])

答案 1 :(得分:-1)

我无法复制与您相同的错误。我唯一能想到的是JSON中每个对象中的最后一项不应该有逗号。看看是否能解决您的错误