Как создать два цикла для понимания списка 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)

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

4 60

4 ответа:

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

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

лучший способ запомнить это заключается в том, что порядок цикла 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]

соответствующий 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']]

EDIT - поскольку вам нужно, чтобы результат был сглажен, вы можете использовать аналогичное понимание списка, а затем сгладить результаты.

>>> 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 звонок))

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

result = []
[result.extend(entry) for tag in tags for entry in entries if tag in entry]

print(result)

выход:

['man', 'thats', 'right', 'awesome']