Computer >> 컴퓨터 >  >> 프로그래밍 >> Python

Python - 특정 단어들이 문장 목록에 함께 포함되어 있는지 확인하는 방법

여러 개의 짧은 문장을 요소로 가진 리스트가 있다고 가정해 보겠습니다. 그리고 첫 번째 리스트의 문장들에서 사용된 단어 일부를 담고 있는 또 다른 리스트가 있습니다. 이때 두 번째 리스트에 있는 두 단어 이상이 첫 번째 리스트의 어떤 문장 안에서 함께 존재하는지 확인하고 싶다면 어떻게 해야 할까요?

이 글에서는 Python으로 이 문제를 해결하는 세 가지 대표적인 방법을 소개합니다.

1. append와 for 반복문 활용하기

가장 기본적인 방법은 for 반복문과 in 조건문을 사용하여 각 문장에 단어들이 포함되어 있는지 검사하는 것입니다. 리스트 컴프리헨션(list comprehension)으로 문장 내에 존재하는 단어를 모아두고, len 함수를 사용해 찾아야 할 단어의 개수와 비교함으로써 모든 단어가 해당 문장에 들어 있는지 판단할 수 있습니다.

예제 코드

list_sen = ['Eggs on Sunday', 'Fruits on Monday', 'Eggs and Fruits on Wednesday']
list_wrd = ['Eggs', 'Fruits']

print("주어진 문장 목록: \n", list_sen)
print("주어진 단어 목록: \n", list_wrd)

res = []
for x in list_sen:
    k = [w for w in list_wrd if w in x]
    if (len(k) == len(list_wrd)):
        res.append(x)
print(res)

실행 결과

주어진 문장 목록:
['Eggs on Sunday', 'Fruits on Monday', 'Eggs and Fruits on Wednesday']
주어진 단어 목록:
['Eggs', 'Fruits']
['Eggs and Fruits on Wednesday']

실행 결과를 보면 'Eggs'와 'Fruits'라는 두 단어가 모두 포함된 문장은 'Eggs and Fruits on Wednesday' 하나뿐임을 알 수 있습니다.

2. all() 함수 활용하기

두 번째 방법은 파이썬 내장 함수인 all()을 활용하는 것입니다. for 반복문으로 각 문장을 순회하면서, 리스트 컴프리헨션과 all 함수를 조합해 해당 문장에 필요한 모든 단어가 실제로 존재하는지 한 번에 검증할 수 있습니다. 코드가 더 간결해지는 장점이 있습니다.

예제 코드

list_sen = ['Eggs on Sunday', 'Fruits on Monday', 'Eggs and Fruits on Wednesday']
list_wrd = ['Eggs', 'Fruits']

print("주어진 문장 목록: \n", list_sen)
print("주어진 단어 목록: \n", list_wrd)

res = [all([k in s for k in list_wrd]) for s in list_sen]
print("\n단어를 포함하는 문장:")
print([list_sen[i] for i in range(0, len(res)) if res[i]])

실행 결과

주어진 문장 목록:
['Eggs on Sunday', 'Fruits on Monday', 'Eggs and Fruits on Wednesday']
주어진 단어 목록:
['Eggs', 'Fruits']

단어를 포함하는 문장:
['Eggs and Fruits on Wednesday']

3. lambda와 map 활용하기

세 번째 방법은 위와 유사한 접근이지만 lambda 표현식과 map 함수를 결합한 방식입니다. 여기서는 split 함수를 추가로 사용해 문장을 단어 단위로 분리한 뒤, 주어진 모든 단어가 그 안에 존재하는지 확인합니다. map 함수는 이 로직을 문장 리스트의 각 요소에 반복적으로 적용하는 역할을 합니다.

예제 코드

list_sen = ['Eggs on Sunday', 'Fruits on Monday', 'Eggs and Fruits on Wednesday']
list_wrd = ['Eggs', 'Fruits']

print("주어진 문장 목록: \n", list_sen)
print("주어진 단어 목록: \n", list_wrd)

res = list(map(lambda i: all(map(lambda j: j in i.split(),
list_wrd)), list_sen))

print("\n단어를 포함하는 문장:")
print([list_sen[i] for i in range(0, len(res)) if res[i]])

실행 결과

주어진 문장 목록:
['Eggs on Sunday', 'Fruits on Monday', 'Eggs and Fruits on Wednesday']
주어진 단어 목록:
['Eggs', 'Fruits']

단어를 포함하는 문장:
['Eggs and Fruits on Wednesday']

마무리

정리하면, for 반복문 + append 방식은 초보자에게 로직이 명확하게 다가오는 장점이 있고, all() 함수를 사용한 방식은 코드가 간결해지며, lambda와 map을 조합한 방식은 함수형 프로그래밍 스타일로 작성할 수 있다는 차이가 있습니다. 상황과 코드 가독성 기준에 맞춰 적절한 방법을 선택하면 됩니다.