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


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

다름이 아니라 제가 사람들의 신상정보에서 키를 기준으로 정렬하는 것을 하고 있는데요. 키가 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

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

  • 2016년 10월 11일에 작성됨
    프로그래머가 되고싶은 1人

조회수 95


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])
  • 2016년 10월 11일에 작성됨
    리눅스(유닉스) 기반의 시스템에서 웹 서비스를 개발하고 있습니다.

  • 감사합니다!! 도움이 많이 되었습니다.    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     

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close