다양한 길이의 단어가 담긴 리스트에서 가장 긴 단어 상위 n개를 골라야 하는 상황을 생각해 볼 수 있습니다. 이 글에서는 이러한 작업을 수행하는 여러 가지 방법을 예제 코드와 함께 살펴보겠습니다.
1. count()와 sorted() 활용
첫 번째 방법은 리스트의 요소들을 내림차순으로 정렬하여 가장 긴 단어들이 리스트 앞쪽에 오도록 만드는 것입니다. 이때 itertools의 count()를 함께 사용하면 각 단어에 고유한 순번을 부여할 수 있어, 길이가 같은 단어들 사이의 정렬 순서도 안정적으로 유지됩니다.
정렬이 완료되면 필요한 개수(x)만큼 슬라이싱하여 원하는 결과를 얻을 수 있습니다.
예제 코드
from itertools import count
def longwords(l, x):
c = count()
return sorted(l, key=lambda i: (len(i), next(c)),
reverse=True)[:x]
listA = ['Earth','Moonshine','Aurora','Snowflakes','Sunshine']
n = 2
print(longwords(listA, n))실행 결과
['Snowflakes', 'Moonshine']
위 코드를 실행하면 길이 기준으로 내림차순 정렬된 리스트에서 앞의 2개 단어인 'Snowflakes'와 'Moonshine'이 반환됩니다.
2. zip과 enumerate 활용
두 번째 방법은 enumerate()를 사용해 리스트의 각 요소에 인덱스를 붙인 뒤, sorted()와 zip() 함수를 조합하는 방식입니다.
여기서 핵심은 정렬 키로 음수 길이 값(-len)을 사용한다는 점입니다. 음수로 변환하면 오름차순 정렬 시 자동으로 내림차순과 같은 효과를 얻을 수 있습니다. 인덱스 역시 음수로 변환하여 동일한 단어 길이일 경우 먼저 등장한 단어가 우선하도록 처리합니다. 마지막으로 필요한 개수만큼 슬라이싱하고, zip(*)으로 인덱스와 단어를 분리한 후 단어 목록만 리스트로 반환합니다.
예제 코드
def longwords(l, x):
idx, words = zip(*sorted(enumerate(l),
key = lambda i: (-len(i[1]), -i[0]))[:x])
return list(words)
listA = ['Earth','Moonshine','Aurora','Snowflakes','Sunshine']
n = 2
print(longwords(listA, n))실행 결과
['Snowflakes', 'Moonshine']
두 방법 모두 동일한 결과를 출력하지만, 첫 번째 방법이 코드가 더 간결하고 직관적입니다. 반면 두 번째 방법은 enumerate를 통해 원래의 인덱스 정보도 함께 얻을 수 있다는 장점이 있으므로, 상황에 맞게 선택하여 사용하면 됩니다.