使用条件循环 JSON 对象
Looping through JSON object with a conditional
循环遍历此 json 对象 content
时遇到一些困难。
json 文件是这样的:
[{'archived': False,
'cache_ttl': None,
'collection': {'archived': False,
'authority_level': None,
'color': '#509EE3',
'description': None,
'id': 525,
'location': '/450/',
'name': 'eaf',
'namespace': None,
'personal_owner_id': None,
'slug': 'eaf'},
'collection_id': 525,
'collection_position': None,
'created_at': '2022-01-06T20:51:17.06376Z',
'creator_id': 1,
'database_id': 4,
}, ... ]
我想遍历列表中的每个字典,检查集合是否为空,然后如果位置等于 '/450/'
return,则为每个集合将该字典附加到列表中。
我的代码如下
content = json.loads(res.text)
for q in content:
if q['collection']:
for col in q['collection']:
if col['location'] == '/450/':
data.append(q)
print(data)
玩过之后,我要么得到 ValueError: too many values to unpack (expected 2)
要么 TypeError: string indices must be integers
如果对我的结构有任何帮助,将不胜感激。
免责声明:
我之前将其写为列表理解,它的工作原理非常棒,但它不再起作用,因为我现在需要检查 collection
是否为空。
我之前是怎么写的:
content = [ x for x in content if x['collection']['location'] == '/450/']
根据您之前的列表理解,"location"
是 q["collection"]
中的一个键。
当你写
for col in q["collection"]
您正在迭代 q["collection"]
中的键。其中一个键是 "location"
。您的 for 循环似乎重复了不必要的次数:
if q['collection'] and "location" in q["collection"] and q["collection"]["location"] == "/450/":
data.append(q)
这应该适合你:
for q in content:
if q['collection']['location'] == '/450/':
data.append(q)
print(data)
如果您使用 for
循环和 for col in q['collection']
,您只需迭代 q['collection']
中的键,所以 cols = ['archived', 'authority_level', ...]
.
不需要遍历 collection 对象,因为它是一个字典,只需要检查位置 属性.
此外,如果“collection”或“location”属性不存在,则使用 dict.get(key) 函数而不是 dict[key],因为如果 key 不存在,后者将引发 KeyError 异常found 和 get() returns None 如果没有找到键值。
content = [{'archived': False,
'cache_ttl': None,
'collection': {'archived': False,
'authority_level': None,
'color': '#509EE3',
'description': None,
'id': 525,
'location': '/450/',
'name': 'eaf',
'namespace': None,
'personal_owner_id': None,
'slug': 'eaf'},
'collection_id': 525,
'collection_position': None,
'created_at': '2022-01-06T20:51:17.06376Z',
'creator_id': 1,
'database_id': 4,
},
{'foo': None}
]
#content = json.loads(res.text)
data = []
for q in content:
c = q.get('collection')
if c and c.get('location') == '/450/':
data.append(q)
print(data)
输出:
[{'archived': False, 'cache_ttl': None, 'collection': { 'location': '/450/', 'name': 'eaf', 'namespace': None }, ...}]
您的 代码迭代次数太多 超出需要。
检查col['location'] = "/450/时,第第二个条件语句出现错误TypeError: string indices must be integers
".
那是因为集合对象中并非所有代币都有sub-objects在那里你可以用他们的键获取数据。
看看你的旧代码和修改后的代码更深入的了解。
# Your old json datas
content = [{'archived': False,
'cache_ttl': None,
'collection': {'archived': False,
'authority_level': None,
'color': '#509EE3',
'description': None,
'id': 525,
'location': '/450/',
'name': 'eaf',
'namespace': None,
'personal_owner_id': None,
'slug': 'eaf'},
'collection_id': 525,
'collection_position': None,
'created_at': '2022-01-06T20:51:17.06376Z',
'creator_id': 1,
'database_id': 4,
} ]
data = []
for q in content:
if q['collection']:
for col in q['collection']:
if col['location'] == '/450/': # The first object in collection object is [archived] which is a string, this causes the program to throw error
data.append(q)
print(data)
这里是修改后的代码
# Your json datas
json_datas = [{'archived': False,
'cache_ttl': None,
'collection': {'archived': False,
'authority_level': None,
'color': '#509EE3',
'description': None,
'id': 525,
'location': '/450/',
'name': 'eaf',
'namespace': None,
'personal_owner_id': None,
'slug': 'eaf'},
'collection_id': 525,
'collection_position': None,
'created_at': '2022-01-06T20:51:17.06376Z',
'creator_id': 1,
'database_id': 4,
} ]
list_data = [] # Your list data in which appends the json data if the location is /450/
for data in json_datas: # Getting each Json data
if len(data["collection"]): # Continue if the length of collection is not 0 [NOTE: 0 = False, 1 or more = True]
if data['collection']['location'] == "/450/": # Check the location
list_data.append(data) # Append if true
print(list_data)
循环遍历此 json 对象 content
时遇到一些困难。
json 文件是这样的:
[{'archived': False,
'cache_ttl': None,
'collection': {'archived': False,
'authority_level': None,
'color': '#509EE3',
'description': None,
'id': 525,
'location': '/450/',
'name': 'eaf',
'namespace': None,
'personal_owner_id': None,
'slug': 'eaf'},
'collection_id': 525,
'collection_position': None,
'created_at': '2022-01-06T20:51:17.06376Z',
'creator_id': 1,
'database_id': 4,
}, ... ]
我想遍历列表中的每个字典,检查集合是否为空,然后如果位置等于 '/450/'
return,则为每个集合将该字典附加到列表中。
我的代码如下
content = json.loads(res.text)
for q in content:
if q['collection']:
for col in q['collection']:
if col['location'] == '/450/':
data.append(q)
print(data)
玩过之后,我要么得到 ValueError: too many values to unpack (expected 2)
要么 TypeError: string indices must be integers
如果对我的结构有任何帮助,将不胜感激。
免责声明:
我之前将其写为列表理解,它的工作原理非常棒,但它不再起作用,因为我现在需要检查 collection
是否为空。
我之前是怎么写的:
content = [ x for x in content if x['collection']['location'] == '/450/']
根据您之前的列表理解,"location"
是 q["collection"]
中的一个键。
当你写
for col in q["collection"]
您正在迭代 q["collection"]
中的键。其中一个键是 "location"
。您的 for 循环似乎重复了不必要的次数:
if q['collection'] and "location" in q["collection"] and q["collection"]["location"] == "/450/":
data.append(q)
这应该适合你:
for q in content:
if q['collection']['location'] == '/450/':
data.append(q)
print(data)
如果您使用 for
循环和 for col in q['collection']
,您只需迭代 q['collection']
中的键,所以 cols = ['archived', 'authority_level', ...]
.
不需要遍历 collection 对象,因为它是一个字典,只需要检查位置 属性.
此外,如果“collection”或“location”属性不存在,则使用 dict.get(key) 函数而不是 dict[key],因为如果 key 不存在,后者将引发 KeyError 异常found 和 get() returns None 如果没有找到键值。
content = [{'archived': False,
'cache_ttl': None,
'collection': {'archived': False,
'authority_level': None,
'color': '#509EE3',
'description': None,
'id': 525,
'location': '/450/',
'name': 'eaf',
'namespace': None,
'personal_owner_id': None,
'slug': 'eaf'},
'collection_id': 525,
'collection_position': None,
'created_at': '2022-01-06T20:51:17.06376Z',
'creator_id': 1,
'database_id': 4,
},
{'foo': None}
]
#content = json.loads(res.text)
data = []
for q in content:
c = q.get('collection')
if c and c.get('location') == '/450/':
data.append(q)
print(data)
输出:
[{'archived': False, 'cache_ttl': None, 'collection': { 'location': '/450/', 'name': 'eaf', 'namespace': None }, ...}]
您的 代码迭代次数太多 超出需要。
检查col['location'] = "/450/时,第第二个条件语句出现错误TypeError: string indices must be integers
".
那是因为集合对象中并非所有代币都有sub-objects在那里你可以用他们的键获取数据。
看看你的旧代码和修改后的代码更深入的了解。
# Your old json datas
content = [{'archived': False,
'cache_ttl': None,
'collection': {'archived': False,
'authority_level': None,
'color': '#509EE3',
'description': None,
'id': 525,
'location': '/450/',
'name': 'eaf',
'namespace': None,
'personal_owner_id': None,
'slug': 'eaf'},
'collection_id': 525,
'collection_position': None,
'created_at': '2022-01-06T20:51:17.06376Z',
'creator_id': 1,
'database_id': 4,
} ]
data = []
for q in content:
if q['collection']:
for col in q['collection']:
if col['location'] == '/450/': # The first object in collection object is [archived] which is a string, this causes the program to throw error
data.append(q)
print(data)
这里是修改后的代码
# Your json datas
json_datas = [{'archived': False,
'cache_ttl': None,
'collection': {'archived': False,
'authority_level': None,
'color': '#509EE3',
'description': None,
'id': 525,
'location': '/450/',
'name': 'eaf',
'namespace': None,
'personal_owner_id': None,
'slug': 'eaf'},
'collection_id': 525,
'collection_position': None,
'created_at': '2022-01-06T20:51:17.06376Z',
'creator_id': 1,
'database_id': 4,
} ]
list_data = [] # Your list data in which appends the json data if the location is /450/
for data in json_datas: # Getting each Json data
if len(data["collection"]): # Continue if the length of collection is not 0 [NOTE: 0 = False, 1 or more = True]
if data['collection']['location'] == "/450/": # Check the location
list_data.append(data) # Append if true
print(list_data)