#python #python-3.x
Вопрос:
У меня есть JSON в заданном формате, и моя цель-определить, соответствует ли пара ключ-значение
«имя» : «Важно 1», «имя» : «Важно 2», «имя» : «Важно 3» существует под «ТЕГОМ 3» или нет?
Мне нужно сделать это с помощью Python. Есть какие-нибудь предложения? Я пробовал различные предложенные примеры, но ни один из них не может проанализировать данный пример.
{
"BASE": {
"TAG1": [
{
"attr": {
"name": "val1",
"place": "val1"
},
"r1": 65535,
"r2": 444
},
{
"attr": {
"name": "Important1",
"place": "RPlace"
},
"r1": 65535,
"r2": 109
},
{
"attr": {
"name": "Important2",
"place": "GPlace"
},
"r1": 65535,
"r2": 453
},
{
"attr": {
"name": "Important3",
"place": "BPlace"
},
"r1": 65535,
"r2": 109
}
],
"my-id": 2412922,
"TAG2": [
{
"attr": {
"name": "val1",
"place": "val1"
},
"r1": 65535,
"r2": 444
},
{
"attr": {
"name": "Important1",
"place": "RPlace"
},
"r1": 65535,
"r2": 109
},
{
"attr": {
"name": "Important2",
"place": "GPlace"
},
"r1": 65535,
"r2": 453
},
{
"attr": {
"name": "Important3",
"place": "BPlace"
},
"r1": 65535,
"r2": 109
}
],
"TAG3": [
{
"name": "POSITION",
"place": "POSITION",
"type": "M96"
},
{
"name": "val1",
"place": "val1"
},
{
"name": "Important1",
"place": "RPlace"
},
{
"name": "Important2",
"place": "GPlace"
},
{
"name": "Important3",
"place": "BPlace"
}
],
"out-box": {
"r1": [
6.2,
7.3
],
"r2": [
6.2,
7.3
]
},
"t1": "hldsadh1",
"t2": 0,
"t3": 20,
"string-attr": [
1,
16
],
"r1-chk": 342,
"my-size": 34,
"where": [
2.9,
54.9
],
"sometag": 2,
"revision": 0,
"nodata": [
0,
0
],
"noscale": [
0.001,
0.001
],
"time-val": 3444
}
}
Я попытался использовать функцию ниже, но из-за моих ограниченных знаний python я как бы застрял
def keys_exists(element, *keys):
"""
Check if *keys (nested) exists in `element` (dict).
"""
if type(element) is not dict:
raise AttributeError('keys_exists() expects dict as first argument.')
if len(keys) == 0:
raise AttributeError('keys_exists() expects at least two arguments, one given.')
_element = element
for key in keys:
try:
_element = _element[key]
except KeyError:
return False
return True
Если я сохраняю JSON , которым я поделился, в переменной с именем data1
, то я пытаюсь использовать указанную выше функцию как
keys_exists(data1, "BASE", "TAG3", "name")))
Пожалуйста, не стесняйтесь отказаться от моей версии и поделиться своей собственной.
Комментарии:
1. Можете ли вы показать, что вы пробовали.
2. @blueteeth — Я довольно новичок в python и в зависимости от проб и поиска. Я обновил вопрос, но вы можете поделиться совершенно новым подходом
Ответ №1:
Кажется, вы перебираете все подряд, вместо того чтобы пытаться извлечь то, что вам нужно. Я бы создал функцию, чтобы получить все имена для тега, затем вы можете проверить, существуют ли конкретные имена или нет.
data = json.loads("""
<the json string goes here>
""")
def get_names_by_tag(tag):
return [item["name"] for item in data["BASE"][tag]]
tag3_names = get_names_by_tag("TAG3")
# tag3_names = ['POSITION', 'val1', 'Important1', 'Important2', 'Important3']
important_names = ["Important1", "Important2", "Important3"]
if all(important_name in tag3_names for important_name in important_names):
# do something
Комментарии:
1. С помощью этого кода я получаю ошибку ниже. Обратная связь (последний последний вызов): Файл «main.py», строка 137, в файле <module> tag3_names = get_names_by_tag(«TAG3») «main.py», строка 135, в get_names_by_tag возвращает [элемент[«имя»] для элемента в данных[«БАЗА»][тег]] Ошибка типа: строковые индексы должны быть целыми числами
2. Загрузили json в качестве диктанта?
3. Я очень новичок в python. Я только что назначил data = «‘ <данные json> «‘. Не могли бы вы подробнее рассказать?
4. Вам нужно загрузить строку json в объект python. Видишь docs.python.org/3/library/json.html#json.loads (и моя правка)
5. Ты уже все понял.
all(...)
в основном И-все в цикле.any(...)
является эквивалентом для ИЛИ. 🙂