2016-10-10 1 views
-1

Я пытаюсь преобразовать нормальную вложенную итерацию в список гнезд, и у меня возникают проблемы.Ошибка понимания вложенного списка 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 
+0

Снова прочитайте свои предложения 'for'. – user2357112

+3

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

+0

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

ответ

2

У вас есть ваш вложенности порядок неправильно, и вы забыли, чтобы получить '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 заявления и помещая результат внутри [...] квадратных скобок.

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

+0

facepalm .... ty tho :) – ajanakos