여러 개의 짧은 문장을 요소로 가진 리스트가 있다고 가정해 보겠습니다. 그리고 첫 번째 리스트의 문장들에서 사용된 단어 일부를 담고 있는 또 다른 리스트가 있습니다. 이때 두 번째 리스트에 있는 두 단어 이상이 첫 번째 리스트의 어떤 문장 안에서 함께 존재하는지 확인하고 싶다면 어떻게 해야 할까요?
이 글에서는 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을 조합한 방식은 함수형 프로그래밍 스타일로 작성할 수 있다는 차이가 있습니다. 상황과 코드 가독성 기준에 맞춰 적절한 방법을 선택하면 됩니다.