Подтвердить что ты не робот

Как создать двух циклов для представления в python

У меня есть два списка, как показано ниже

tags = [u'man', u'you', u'are', u'awesome']
entries = [[u'man', u'thats'],[ u'right',u'awesome']]

Я хочу извлечь записи из entries, когда они находятся в tags:

result = []

for tag in tags:
    for entry in entries:
        if tag in entry:
            result.extend(entry)

Как я могу написать две петли в качестве понимания одной строки?

4b9b3361

Ответ 1

Это должно сделать это:

[entry for tag in tags for entry in entries if tag in entry]

Ответ 2

Лучший способ запомнить это состоит в том, что порядок цикла for внутри понимания списка основан на порядке, в котором они появляются в традиционном цикле. Сначала начинается самая внешняя петля, а затем внутренние петли.

Итак, понимание эквивалентного списка было бы следующим:

[entry for tag in tags for entry in entries if tag in entry]

Обычно оператор if-else приходит перед первым циклом for, и если у вас есть только оператор if, он будет завершен. Например, если вы хотите добавить пустой список, если tag не находится в записи, вы должны сделать это следующим образом:

[entry if tag in entry else [] for tag in tags for entry in entries]

Ответ 3

Соответствующий LC будет

[entry for tag in tags for entry in entries if tag in entry]

Порядок циклов в LC похож на порядок в вложенных циклах, инструкции if идут до конца, а условные выражения идут в начале, что-то вроде

[a if a else b for a in sequence]

См. демонстрацию -

>>> tags = [u'man', u'you', u'are', u'awesome']
>>> entries = [[u'man', u'thats'],[ u'right',u'awesome']]
>>> [entry for tag in tags for entry in entries if tag in entry]
[[u'man', u'thats'], [u'right', u'awesome']]
>>> result = []
    for tag in tags:
        for entry in entries:
            if tag in entry:
                result.append(entry)


>>> result
[[u'man', u'thats'], [u'right', u'awesome']]

РЕДАКТИРОВАТЬ. Поскольку вам нужно, чтобы результат был сплющен, вы могли бы использовать аналогичное понимание списка, а затем сгладить результаты.

>>> result = [entry for tag in tags for entry in entries if tag in entry]
>>> from itertools import chain
>>> list(chain.from_iterable(result))
[u'man', u'thats', u'right', u'awesome']

Добавьте это вместе, вы можете просто сделать

>>> list(chain.from_iterable(entry for tag in tags for entry in entries if tag in entry))
[u'man', u'thats', u'right', u'awesome']

Здесь вы используете выражение генератора вместо понимания списка. (Идеально соответствует предел 79 символов (без вызова list))