Ошибка понимания вложенного списка Python

#python #list-comprehension

#python #понимание списка

Вопрос:

Я пытаюсь преобразовать обычную вложенную итерацию в компилятор вложенного списка, и у меня возникают проблемы.

 for k in r.json()['app_list']:
    for i in titles:
        if k['name'] == i['name'] and k['platform'] == i['platform']:
            array.append(session.get(k['api_url'], headers=headers).json())
return array
  

Однако работает нормально

 return [session.get(k['api_url'], headers=headers).json()
        for i in titles for k in r.json()
        if k['name'] == i['name'] and k['platform'] == i['platform']]
  

выдает эту ошибку

 if k['name'] == i['name'] and k['platform'] == i['platform']]
TypeError: string indices must be integers
  

Комментарии:

1. Прочитайте свои for предложения еще раз.

2. Кроме того, ваш первый работает просто отлично. Зачем искажать его до понимания, которое вы даже не можете выполнить в одной строке?

3. Разве вы не пропустили эту ['app_list'] часть?

4. Список comp более удобочитаем… по крайней мере, для меня

5. В чем разница между r.json() и r.json()['app_list'] ? Не могли бы вы вставить вывод r.json() ?

Ответ №1:

У вас неправильный порядок вложенности, и вы забыли получить 'app_list' ключ из r.json() словаря.

Циклы понимания списка по-прежнему перечислены в том же порядке, слева направо, когда вы их вкладываете. Другими словами, используйте тот же порядок, что и ваши исходные вложенные for операторы:

 return [session.get(k['api_url'], headers=headers).json()
        for k in r.json()['app_list']
        for i in titles
        if k['name'] == i['name'] and k['platform'] == i['platform']]
  

Вышеуказанное было достигнуто просто путем помещения всего в array.append() вызов спереди, затем удаления : двоеточий из for операторов if and и помещения результата в [...] квадратные скобки.

Вы забыли ['app_list'] подписку на r.json() , и это фактическая причина исключения; r.json() создает словарь, поэтому каждый k из них был привязан к ключу из этого словаря, что k['name'] привело к сбою подписки.