Как создать вложенный цикл for с помощью генератора в python?

#python #syntax #nested #generator #bioinformatics

#питон #синтаксис #вложенный #генератор #биоинформатика

Вопрос:

Я пытаюсь преобразовать этот вложенный цикл for:

         for k,v in all_R.iteritems():
            for pairs in v:
                print pairs[1]
 

для однострочника, что-то вроде этого:

 print ([pairs[1] for pairs in v for k,v in all_R.iteritems()])
 

Но я получаю эту ошибку:

     UnboundLocalError: local variable 'v' referenced before assignment
 

all_R — это defaultdict, где каждое значение имеет ключи, которые являются парами, и меня интересует только одно значение из этой пары:

      {'1-0002': [('A-75G', 'dnaN'), ('I245T', 'recF'),... ], '1-0004': [('A-75G', 'dnaN'), ('L161', 'dnaN'),...]}
 

Ответ №1:

Описания списков записываются в том же порядке, что и для циклов, поэтому вы на самом деле ищете (обратите внимание, что порядок обратный)

 ([pairs[1] for k,v in all_R.iteritems() for pairs in v ])
 

Вот разбивка, которая показывает структуру немного более четко:

 [
    pairs[1]
        for k,v in all_R.iteritems()
            for pairs in v
]
 

Если вы хотите использовать генераторы, как предполагает ваш заголовок, вы можете использовать круглые скобки вместо скобок.

 (pairs[1] for k,v in all_R.iteritems() for pairs in v)
 

Это создаст генератор с вашими желаемыми свойствами.