Eu tenho duas listas como abaixo
tags = [u'man', u'you', u'are', u'awesome']
entries = [[u'man', u'thats'],[ u'right',u'awesome']]
Quero extrair entradas de entries
quando elas estiverem em tags
:
result = []
for tag in tags:
for entry in entries:
if tag in entry:
result.extend(entry)
Como posso escrever os dois loops como uma compreensão de lista de uma única linha?
python
list
for-loop
list-comprehension
Shiva Krishna Bavandla
fonte
fonte
itertools.chain
se quiser uma lista nivelada:list(chain.from_iterable(entry for tag in tags for entry in entries if tag in entry))
Respostas:
Isso deve servir:
fonte
A melhor maneira de lembrar isso é que a ordem do loop for dentro da compreensão da lista é baseada na ordem em que eles aparecem na abordagem de loop tradicional. A maioria dos loops externos vem primeiro e, em seguida, os loops internos subsequentemente.
Portanto, a compreensão de lista equivalente seria:
Em geral, a
if-else
instrução vem antes do primeiro loop for e, se você tiver apenas umaif
instrução, ela virá no final. Por exemplo, se você gostaria de adicionar uma lista vazia, setag
não estiver na entrada, você faria assim:fonte
O LC apropriado seria
A ordem dos loops no LC é semelhante à dos loops aninhados, as instruções if vão para o final e as expressões condicionais vão para o início, algo como
Veja a demonstração -
EDITAR - Como você precisa que o resultado seja nivelado, você pode usar uma compreensão de lista semelhante e, em seguida, nivelar os resultados.
Somando isso, você poderia apenas fazer
Você usa uma expressão geradora aqui em vez de uma compreensão de lista. (Corresponde perfeitamente ao limite de 79 caracteres também (sem a
list
chamada))fonte
Resultado:
fonte
Na compreensão, a iteração de listas aninhadas deve seguir a mesma ordem que os loops for imbricados equivalentes.
Para entender, vamos dar um exemplo simples da PNL. Você deseja criar uma lista de todas as palavras de uma lista de frases em que cada frase é uma lista de palavras.
Para remover as palavras repetidas, você pode usar um conjunto {} em vez de uma lista []
ou aplique
list(set(all_words))
fonte
fonte