파이썬 리스트에서 가장 짧은 단어 추출하는 법 질문드립니다

조회수 4888회
words = [[['Portuguese', ['Eu', 'falo', 'Português', 'muito', 'bem.']],
['English', ['I', 'speak', 'Portuguese', 'very', 'well.']]]

이런 리스트에서 사용된 단어 중 가장 짧은 걸 추출하고 싶은데요

min(words)라고 하면 제일 짧은 리스트를 보여줘서 ['English', ['I', 'speak', 'Portuguese', 'very', 'well.']] 이게 나오네요ㅠㅠ

이렇게 말고 'I'가 제일 짧은 단어니까 I가 나오도록 하고 싶은데 코드를 어떻게 짜면 되나요?ㅠㅠ

  • (•́ ✖ •̀)
    알 수 없는 사용자

2 답변

  • 적어주신 데이터에 괄호 [, ] 쌍이 잘 맞지 않는것 같으니 먼저 데이터를 예쁘게 펴 봅시다.

    words = [
      ['Portuguese', ['Eu', 'falo', 'Português', 'muito', 'bem.']],
      ['English', ['I', 'speak', 'Portuguese', 'very', 'well.']]  
    ]
    

    위 데이터를 펼쳐보면 가장 최 상위 리스트([]) 가 하나 있고, 해당 리스트는 나라와 단어를 가지고 있는 목록을 2개 가지고 있습니다.

    각각 ['Portuguese', ['Eu', 'falo', 'Português', 'muito', 'bem.']]['English', ['I', 'speak', 'Portuguese', 'very', 'well.']] 입니다.

    찾으시려는 데이터는 가장 길이가 짧은 단어 입니다. 이를 찾기 위해서는 데이터가 중첩되어 있기 때문에 전체를 순회해 주셔야 합니다.

    중첩된 리스트를 하나씩 풀면서 천천히 따라가 보시면 됩니다.

    아래 소스에 있는 실행하기 링크를 클릭해서 따라가 보세요.

    words = [
      ['Portuguese', ['Eu', 'falo', 'Português', 'muito', 'bem.']],
      ['English', ['I', 'speak', 'Portuguese', 'very', 'well.']]  
    ]
    
    min_word = None
    
    for lss in words: # 최 상위 목록을 순회하면서
      for ls in lss: # 언어/단어 목록을 순회하면서
        if type(ls) is not list: 
          pass # 나라 이름은 무시    
        else: 
          for word in ls: # 각 단어를 순회하면서
            if min_word == None or len(word) < len(min_word): 
              min_word = word
    
    print(min_word) 
    

    p.s: 쉽게 설명하려고 풀어서 썼으나 좋은 코드는 아닙니다.

    • (•́ ✖ •̀)
      알 수 없는 사용자
    • 친절한 답변 정말 감사드립니다!! 쉽게 이해가 됐어요!!! 중첩for를 생각도 못하고 몇글자로 해결하겨로 했네요ㅠㅠㅠ 감사해요! 알 수 없는 사용자 2016.10.3 13:37
  • 리스트에서 가장 짧은 길이의 단어를 선택하려면 함수를 따로 만드는 것이 좋을 것 같습니다.


    min함수는 값이 가장 작은 것을 고르는 것임으로, 문자열의 경우 정렬시 가장 앞에 오는 값이 선택됩니다.


    따라서 정대원님의 답변 처럼 반복문을 사용해서 가장 작은 길이의 문자열을 선택하거나, 다음과 같이 lambdareduce함수를 이용해서 리스트에서 가장 길이 짧은 단어를 선택하는 함수(예제에서는 minlength 함수)를 정의해보세요.

    from functools import reduce  #python3 에서는 반드시 추가해야함.
    
    def minlength(words):
        '''
        return reduce(lambda w1, w2: w1 if len(w1)<len(w2) else w2, words)
    

    다음은 위의 minlength를 이용한 실행 예입니다.

    from functools import reduce  #python3 에서는 반드시 추가해야함.
    
    def minlength(words):
        '''@param words 단어리스트'''
        return reduce(lambda w1, w2: w1 if len(w1)<len(w2) else w2, words)    
    
    words = [
      ['English', ['speak', 'Portuguese', 'very', 'well.','I']],
      ['Portuguese', ['Eu', 'falo', 'Português', 'muito', 'bem.', 'Abc']]
    ]
    
    # words의 모든 원소 x에 대해서 minlength(x[1])을 수행한 결과를 리스트로 만듭니다.
    minwords = list(map(lambda x: minlength(x[1]), words))
    # minwords는 위 words 리스트의 국가별 단어중 가장 짧은 단어가 선택되어 있습니다.
    # 그중에서 가장 짧은 단어를 다시 선택합니다.
    print(minlength(minwords))
    
    • 완전 초보라 reduce랑 lambda함수는 배우지 못했는데 사용하니 훨씬 짧게 정리가 되네요. 많은 도움이 됐어요ㅠㅠ 감사합니다! 알 수 없는 사용자 2016.10.3 13:41

답변을 하려면 로그인이 필요합니다.

프로그래머스 커뮤니티는 개발자들을 위한 Q&A 서비스입니다. 로그인해야 답변을 작성하실 수 있습니다.

(ಠ_ಠ)
(ಠ‿ಠ)