TypeError:在Python中过滤JSON中的值时,字符串索引必须为整数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了TypeError:在Python中过滤JSON中的值时,字符串索引必须为整数相关的知识,希望对你有一定的参考价值。

x = { "people": [{ "owner": "bob", "petname": "fido", "species": "dog", "size": "chunky"}, {"owner": "mary","petname": "marvin","species": "cat","size": "cat"}]}
    y = json.dumps(x)
    z = json.loads(y)
    for i in z:
        if i["owner"] == "bob":
            print(i['petname'])
            break

此代码的目标是通过给所有者名称“ bob”来返回“ fido”

但是我得到的只是TypeError:字符串索引必须是整数。我究竟做错了什么?谢谢

答案

您正在迭代基本的dictionary,而不是迭代list下的people

迭代包含z["people"]list,而不是迭代z解决方案

x = { "people": [{ "owner": "bob", "petname": "fido", "species": "dog", "size": "chunky"}, {"owner": "mary","petname": "marvin","species": "cat","size": "cat"}]}
    y = json.dumps(x)
    z = json.loads(y)
    for i in z["people"]:
        if i["owner"] == "bob":
            print(i['petname'])
            break

此外,我看不到需要使用

y = json.dumps(x)
z = json.loads(y)

您可以简单地使用基础词典x

for i in x["people"]:
    if i["owner"] == "bob":
       print(i['petname'])
       break
另一答案

错误原因:您正在遍历字典的键。因此,最初ipeople,它是一个字符串。您正在尝试i["owner"],因为i是字符串,它会引发错误。

x实际上是一个字典,您可以直接使用它而无需使用json包。

代码:

x = { "people": [{ "owner": "bob", "petname": "fido", "species": "dog", "size": "chunky"}, {"owner": "mary","petname": "marvin","species": "cat","size": "cat"}]}
people = x["people"]
for i in people:
    if i["owner"] == "bob":
        print(i['petname'])
        break

如果需要JSON

import json
x = { "people": [{ "owner": "bob", "petname": "fido", "species": "dog", "size": "chunky"}, {"owner": "mary","petname": "marvin","species": "cat","size": "cat"}]}
y = json.dumps(x)
z = json.loads(y)
people = z["people"]
for i in people:
    if i["owner"] == "bob":
        print(i['petname'])
        break

输出:

fido
另一答案

解决方案

两种方法:

  1. 简单的pythonic-具有listdicts
  2. 使用pandas-功能强大且用途广泛

首先,这个问题需要从业务逻辑方面进行一些澄清:

  • 如果同一所有者的名称在多个字典中会发生什么:一个所有者到多个宠物的映射
  • 我们假设没有两个所有者可以使用相同的名称。或者,我们可以吗?
  • 如果通过搜索获得了多只宠物,您将如何格式化结果? listnumpy array,字典,其中键:所有者和值:宠物列表,还是熊猫数据框/系列?

使用简单的listdicts-更多pythonic

owner = 'bob'
pets = [d.get("petname") for d in z["people"] if (d.get('owner', None) == owner)]
print(pets) 

输出

['fido']

使用Pandas提取信息

考虑到前面介绍的所有参数,我认为使用pandas.Dataframe提取目标数据将非常简洁,灵活和简单。但是,请注意,我们将导入一个繁重的库(例如pandas)来执行此操作,而不是使用core-python库。但是,如果您仍在处理大量数据,那么利用pandas的奇妙意义更大。

import pandas as pd
people = pd.DataFrame(z["people"])
people.loc[people.owner=='bob', "petname"].to_list() # get as a list

输出

['fido']
print(people) #print dataframe

  owner petname species    size
0   bob    fido     dog  chunky
1  mary  marvin     cat     ca

关于虚拟数据

我为OP和/或其他人阅读了这篇文章添加了一些解释,以下代码块中的操作正在逐步进行。这部分的清晰性是理解建议解决方案的关键。

import json

x = { "people": [
        { "owner": "bob", "petname": "fido", "species": "dog", "size": "chunky"}, 
        {"owner": "mary","petname": "marvin","species": "cat","size": "cat"}          
    ]   
} 
type(x) # dict

# convert dict, x into a string y
# this y could be considered as what 
# one could read in from a json file
y = json.dumps(x)
type(y) # str

# load the string, y 
# into a dict, z
#    thus, z == x
z = json.loads(y)
type(z) # dict
print(z == x) # True

以上是关于TypeError:在Python中过滤JSON中的值时,字符串索引必须为整数的主要内容,如果未能解决你的问题,请参考以下文章

TypeError:对象在 DJango 1.8 Python 3.4 中不是 JSON 可序列化的

在 Python 中读取 JSON 字符串:接收错误“TypeError:字符串索引必须是整数”

JSON解析时出现:TypeError: the JSON object must be str, bytes or bytearray, not NoneType

TypeError:使用Python解析JSON时字符串索引必须是整数?

使用 Pandas 在 Python 中过滤嵌套的 JSON 数据

在 Python 中使用 GraphQL 过滤 JSON 数据