파이썬) 피트, 인치 단위 정렬하기

안녕하세요. 막 프로그래밍에 들어간 새내기입니다!

다름이 아니라 제가 사람들의 신상정보에서 키를 기준으로 정렬하는 것을 하고 있는데요. 키가 cm으로 적혀있으면 괜찮은데 ft와 in로 나와있습니다.. ft는 상관 없는데 in에서 정렬이 이상하게 됩니다. 6ft 1in // 5ft 4in // 5ft 10in

이걸 정렬하면 6ft 1in // 5ft 10in // 5ft 4in 이렇게 되야 정상인데. 6ft 1in // 5ft 4in // 5ft 10in 이렇게 정렬이 되버립니다..

in을 cm로 변환하는 것 까진 생각을 했는데 어떻게 구현해야 할지 모르겠습니다.

고수님들 도와주세요!!

def process_roster_files(path_to_directory):
filenames = glob('lab03/rosters/*.txt')
summ = []
name = ""
height = ""
for item in filenames:
    myFile = open(item, 'r')
    key = myFile.readlines()
    for line in key:
        if 'Name' in line:            
            name = line.lstrip('Name:\t').rstrip('\n')

        if 'Height' in line:
            height = line.lstrip('Height:\t').rstrip('\n')
            summ.append([name, height])


summ.sort(reverse=False)
output_file = open('hello.csv', 'w')
height_list_file = 'hello.csv'
for i in range(0,6):
    output_file.write(summ[i][0]+', '+summ[i][1] + '\n')

output_file.close()
return height_list_file

이것은 제가 작성한 코드입니다..

2답변

  • 좋아요

    2

    싫어요
    채택취소하기

    정렬 키를 생성하는 함수를 한번 만들어서 사용해보세요.

    import re
    
    def length_to_num(val):
        """ Xft Yin 으로 입력되는 문자열을 ft 단위로 변환합니다 """
        # 정규식을 써서 ft 앞부분의 숫자와 in 앞부분의 숫자를 추출
        m = re.match(r"(\d+)ft\s*(\d+)in",val)
        # m.group(0)는 정규식 매칭된 전체문자열
        # m.group(1)은 1번째 ()에 매칭된 문자열
        # m.group(2)는 2번째 ()에 매칭된 문자열
        # 1 ft = 12 in 임으로, 이를 반영
        return int(m.group(1)) + float(m.group(2))/12
    

    위의 함수를 사용해서 정렬 해보세요. 다음은 테스트 예제입니다.

    import re
    
    def length_to_num(val):
        """ Xft Yin 으로 입력되는 문자열을 ft 단위로 변환합니다 """
        # 정규식을 써서 ft 앞부분의 숫자와 in 앞부분의 숫자를 추출
        m = re.match(r"(\d+)ft\s*(\d+)in",val)
        # m.group(0)는 정규식 매칭된 전체문자열
        # m.group(1)은 1번째 ()에 매칭된 문자열
        # m.group(2)는 2번째 ()에 매칭된 문자열
        # 1 ft = 12 in 임으로, 이를 반영
        return int(m.group(1)) + float(m.group(2))/12
    
    li = ["3ft 6in","3ft 9in","3ft 10in","3ft 1in","5ft 10in"]
    li.sort(key=length_to_num, reverse=False)
    # 정렬시 item을 정렬할 키로 변경하는 함수를 key 인자에 전달합니다.
    print(li[0])
    print(li[1])
    
    • 감사합니다!! 도움이 많이 되었습니다. Francis Shin 2016.10.18 22:53
  • 앞의 분 답변에서 length_to_num()을 정규식을 쓰지 않고 구현해볼 수도 있겠습니다. 데이터 파일에 소숫점이 있다거나 ft만 있거나 ft나 in단위가 잘 못 써졌거나 할 경우도 고려한 코드 입니다.

    def str_to_num(arg):
        #return int(''.join(n for n in arg if n.isdigit()))
        return float(''.join(n for n in arg if n in '0123456789.'))
    
    def get_only_nums(str):
        return [str_to_num(x) for x in str.split()]
    
    def length_to_num(str):
        nums = get_only_nums(str)
        # print(nums)
        if len(nums) == 1:
            return nums[0] * 12
        else:
            return nums[0] * 12 + nums[1]
    
    print(length_to_num("   6ft    5.3in    "))
    print(length_to_num(" 6ft"))
    
    • 오오 정규식을 쓰지 않고도 할 수 있군요,, 감사합니다! Francis Shin 2016.10.18 22:50

ᕕ( ᐛ )ᕗ
로그인이 필요합니다

작성한 답변에 다른 개발자들이 댓글을 작성하거나 댓글에 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.