List Comprehension Python에서 두 개의 for 루프를 프레임하는 방법


101

다음과 같이 두 가지 목록이 있습니다.

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)

두 개의 루프를 한 줄 목록 이해로 작성하려면 어떻게해야합니까?


3
itertools.chain평면화 된 목록을 원하는 경우 사용 :list(chain.from_iterable(entry for tag in tags for entry in entries if tag in entry))
Ashwini Chaudhary

답변:


135

이렇게해야합니다.

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

158

이것을 기억하는 가장 좋은 방법은 목록 이해력 내 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]

6

적절한 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']

여기에서는 목록 이해 대신 생성기 표현식을 사용합니다. ( list전화 없이도 79 자 제한과 완벽하게 일치 )


2
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']

1
return=[entry for tag in tags for entry in entries if tag in entry for entry in entry]

6
안녕하세요, Stack Overflow에 오신 것을 환영합니다! 코드뿐만 아니라 설명을 게시하십시오.
Evelyn

1
여보세요! 이 코드가 문제를 해결할 수 있지만 문제를 해결하는 방법과 이유에 대한 설명포함 하여 게시물의 품질을 향상시키는 데 실제로 도움이되며 아마도 더 많은 찬성 투표를 받게됩니다. 지금 질문하는 사람뿐만 아니라 미래에 독자를 위해 질문에 답하고 있다는 것을 기억하십시오. 제발 편집 설명을 추가하고 제한 및 가정이 적용 무엇의 표시를 제공하는 답변을.
Brian

0

이해하자면, 중첩 된 목록 반복은 동일한 imbricated for 루프와 동일한 순서를 따라야합니다.

이해하기 위해 NLP에서 간단한 예를 들어 보겠습니다. 각 문장이 단어 목록 인 문장 목록에서 모든 단어 목록을 만들고 싶습니다.

>>> list_of_sentences = [['The','cat','chases', 'the', 'mouse','.'],['The','dog','barks','.']]
>>> all_words = [word for sentence in list_of_sentences for word in sentence]
>>> all_words
['The', 'cat', 'chases', 'the', 'mouse', '.', 'The', 'dog', 'barks', '.']

반복되는 단어를 제거하려면 목록 [] 대신 {} 집합을 사용할 수 있습니다.

>>> all_unique_words = list({word for sentence in list_of_sentences for word in sentence}]
>>> all_unique_words
['.', 'dog', 'the', 'chase', 'barks', 'mouse', 'The', 'cat']

또는 적용 list(set(all_words))

>>> all_unique_words = list(set(all_words))
['.', 'dog', 'the', 'chases', 'barks', 'mouse', 'The', 'cat']
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.