파이썬) 피트, 인치 단위 정렬하기
조회수 2812회
안녕하세요. 막 프로그래밍에 들어간 새내기입니다!
다름이 아니라 제가 사람들의 신상정보에서 키를 기준으로 정렬하는 것을 하고 있는데요. 키가 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 답변
-
정렬 키를 생성하는 함수를 한번 만들어서 사용해보세요.
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])
-
앞의 분 답변에서 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"))
-
(•́ ✖ •̀)
알 수 없는 사용자
-
댓글 입력