【问题标题】:Issues iterating through JSON list in Python?在 Python 中遍历 JSON 列表的问题?
【发布时间】:2016-04-29 07:59:53
【问题描述】:

我有一个包含 JSON 数据的文件,如下所示:

{
    "Results": [
            {"Id": "001",
            "Name": "Bob",
            "Items": {
                "Cars": "1",
                "Books": "3",
                "Phones": "1"}
            },

            {"Id": "002",
            "Name": "Tom",
            "Items": {
                "Cars": "1",
                "Books": "3",
                "Phones": "1"}
            },

            {"Id": "003",
            "Name": "Sally",
            "Items": {
                "Cars": "1",
                "Books": "3",
                "Phones": "1"}
            }]
}

我不知道如何正确循环 JSON。我想遍历数据并为数据集中的每个成员获取带有 Cars 的名称。我怎样才能做到这一点?

import json

with open('data.json') as data_file:
    data = json.load(data_file)

print data["Results"][0]["Name"] # Gives me a name for the first entry
print data["Results"][0]["Items"]["Cars"] # Gives me the number of cars for the first entry

我尝试使用以下方法循环它们:

for i in data["Results"]:
print data["Results"][i]["Name"]    

但是收到一个错误: TypeError:列表索引必须是整数,而不是字典

【问题讨论】:

  • for i in data["Results"]: i["Name"]
  • 如果我理解正确,你想要:{person['Name']: person['Items']['Cars'] for person in data["Results"]}

标签: python arrays json for-loop


【解决方案1】:

您假设i 是一个索引,但它是一个字典,请使用:

for item in data["Results"]:
    print item["Name"]    

引用自for Statements

Python 中的 for 语句与您在 C 或 Pascal 中可能使用的语句有些不同。 Python 的 for 语句不是总是迭代数字的算术级数(如在 Pascal 中),或者让用户能够定义迭代步骤和停止条件(如 C),Python 的 for 语句迭代任何序列的项目(列表或字符串),按照它们在序列中出现的顺序

【讨论】:

【解决方案2】:

您正在遍历字典而不是索引,因此您应该使用。

for item in data["Results"]:
    print item["Name"]    

for i in range(len(data["Results"])):
    print data["Results"][i]["Name"]

【讨论】:

    【解决方案3】:

    混淆在于如何在迭代中使用字典和列表。 字典将遍历它的键(您将其用作索引以获取相应的值)

    x = {"a":3,  "b":4,  "c":5}
    for key in x:   #same thing as using x.keys()
       print(key,x[key]) 
    
    for value in x.values():
        print(value)      #this is better if the keys are irrelevant     
    
    for key,value in x.items(): #this gives you both
        print(key,value)
    

    但是遍历列表的默认行为会给你元素而不是索引:

    y = [1,2,3,4]
    for i in range(len(y)):  #iterate over the indices
        print(i,y[i])
    
    for item in y:
        print(item)  #doesn't keep track of indices
    
    for i,item in enumerate(y): #this gives you both
        print(i,item)
    

    如果你想概括你的程序来处理这两种类型,你可以使用以下函数之一:

    def indices(obj):
        if isinstance(obj,dict):
            return obj.keys()
        elif isinstance(obj,list):
            return range(len(obj))
        else:
            raise TypeError("expected dict or list, got %r"%type(obj))
    
    def values(obj):
        if isinstance(obj,dict):
            return obj.values()
        elif isinstance(obj,list):
            return obj
        else:
            raise TypeError("expected dict or list, got %r"%type(obj))
    
    def enum(obj):
        if isinstance(obj,dict):
            return obj.items()
        elif isinstance(obj,list):
            return enumerate(obj)
        else:
            raise TypeError("expected dict or list, got %r"%type(obj))
    

    例如,如果您稍后更改 json 以使用 id 作为键将结果存储在 dict 中,则程序仍会以相同的方式遍历它:

    #data = <LOAD JSON>
    for item in values(data["Results"]):
        print(item["name"])
    
    #or
    for i in indices(data["Results"]):
        print(data["Results"][i]["name"])
    

    【讨论】:

      【解决方案4】:
      for json_data in data['Results']:
          for attribute, value in json_data.iteritems():
              print attribute, value # example usage
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-12-29
        • 1970-01-01
        • 1970-01-01
        • 2016-07-16
        • 2016-08-27
        • 2011-09-14
        相关资源
        最近更新 更多