#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']
привело к сбою подписки.