Как мне использовать индекс с пониманием списка? - PullRequest
1 голос
/ 19 мая 2019

Я пытаюсь отфильтровать массив JSON на основе значения, содержащегося в каждом из массивов. При условии некоторого пользовательского ввода, я только хочу вернуть соответствующие значения в зависимости от типа.

Образец JSON:

{
    "routes": [
        {
            "name": "Golden Shower",
            "type": "Boulder",
            "rating": "V5",
            "stars": 5,
            "starVotes": 131,
            "pitches": ""
        },
        {
            "name": "Girls Only",
            "type": "Sport",
            "rating": "5.10a",
            "stars": 4.9,
            "starVotes": 156,
            "pitches": "1"
        }
    ],
    "success": 1
}

Я попытался использовать несколько вариантов примера кода, приведенного для аналогичного вопроса, но столкнулся с проблемами из-за немного более сложной структуры данных. Смотрите: как фильтровать массив json в python

Я пробовал несколько вариантов кода. Все ошибки связаны с неправильным использованием индексов. Некоторые вещи, которые я пробовал.

routeData = routesByGpsResp.json()
input_dict = routeData
output_dict = [x for x in input_dict if x['type'] == 'Sport']

ошибка: индексы могут быть целыми числами

output_dict = [x for x in input_dict.items() if ['routes'][x]['type'] == 'Sport']

ошибка: списочные индексы должны быть целыми или кусочками, а не кортежем

Мне удалось напечатать список названий маршрутов, использующих для указания индекса, но, похоже, не могу понять это для понимания списка.

for key in range(len(routeData['routes'])):
    print(routeData['routes'][key]['name'])

Является ли понимание списка неправильным путем? Должен ли я вместо этого использовать оператор for?

Любая помощь приветствуется!

Ответы [ 2 ]

2 голосов
/ 19 мая 2019

Примечание: все ваши попытки: список пониманий , в то время как имя переменной предполагает dict понимание ( [Python]: PEP 274 -Понятия Dict ).

Вот пример того, как вы можете получить output_dict (и ниже, output_list ) на основе вашего input_dict ,и условие (я).Примечание: понимание dict включает в себя понимание list (которое само по себе составляет пример 2 nd ) для «маршрутов» ключав то время как для всех остальных ключей значения остаются без изменений:

>>> output_dict = {k: v if k != "routes" else [i for i in v if i["type"] == "Sport"] for k, v in input_dict.items()}
>>>
>>> from pprint import pprint
>>>
>>> pprint(output_dict)
{'routes': [{'name': 'Girls Only',
             'pitches': '1',
             'rating': '5.10a',
             'starVotes': 156,
             'stars': 4.9,
             'type': 'Sport'}],
 'success': 1}
>>>
>>> # Or if you only want the list
...
>>> output_list = [i for i in input_dict.get("routes", list()) if i["type"] == "Sport"]
>>>
>>> pprint(output_list)
[{'name': 'Girls Only',
  'pitches': '1',
  'rating': '5.10a',
  'starVotes': 156,
  'stars': 4.9,
  'type': 'Sport'}]
1 голос
/ 19 мая 2019

В первой попытке:

output_dict = [x for x in input_dict if x['type'] == 'Sport']

x in input_dict перебирает ключи, поэтому вы делаете "routes"['type'], но строки - это индексы по целым числам, а не по строке, отсюда и ошибка string indices must be integers

Во второй попытке:

output_dict = [x for x in input_dict.items() if ['routes'][x]['type'] == 'Sport']

['routes'] - это список, а x - это кортеж (key,value), полученный путем итерации по словарю input_dict, поэтому ['routes'][x] поднимает error: list indices must be integers or slices, not tuple

Правильный способ для понимания списка, как уже указывалось в @ cs95, это перебирать список маршрутов с помощью for x in input_dict.get('routes'), получить словарьдля значения ключа type, которое соответствует Sport

print([x for x in input_dict.get('routes') if x.get('type') == 'Sport'])

Выходные данные

[{'name': 'Girls Only', 'type': 'Sport', 'rating': '5.10a', 'stars': 4.9, 'starVotes': 156, 'pitches': '1'}]
...