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