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
错误原因:您正在遍历字典的键。因此,最初i
是people
,它是一个字符串。您正在尝试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
解决方案
两种方法:
- 简单的pythonic-具有
list
和dicts
- 使用
pandas
-功能强大且用途广泛
首先,这个问题需要从业务逻辑方面进行一些澄清:
- 如果同一所有者的名称在多个字典中会发生什么:一个所有者到多个宠物的映射
- 我们假设没有两个所有者可以使用相同的名称。或者,我们可以吗?
- 如果通过搜索获得了多只宠物,您将如何格式化结果?
list
,numpy array
,字典,其中键:所有者和值:宠物列表,还是熊猫数据框/系列?
使用简单的list
和dicts
-更多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时字符串索引必须是整数?