2016-10-22 2 views
0

저는 방금 파이썬으로 시작해서 이것을 정렬하는 방법에 대해 궁금합니다.시간 목록을 정렬하는 방법

목록은 가장 빠른 시간부터 최신 날짜까지입니다.

('5:00PM','2:00PM','7:00AM','8:45PM','12:00PM') 

도움을 주시면 감사하겠습니다.

+0

무엇을 시도 했습니까? 당신의 일을 보여주세요. 또한, 이들은 시간 목록이 아니며, 문자열입니다. – Soviut

+0

정렬 조건은 무엇입니까? 당신이 보여주는 것은 튜플이지 목록이 아닙니다. 아직 해보려 했습니까? 코드를 보여줄 수 있습니까? – idjaw

+2

후 [list.sort() (https://docs.python.org/3/library/stdtypes.html#의 핵심 기능으로 사용 목록의 시간의 24 당량 정수를 리턴하는 함수를 작성 list.sort) – wwii

답변

1

나는 당신이 PyPi DateTime 패키지를 설치하고 당신이 원하는 무엇이든 조작을 위해 그 시설을 사용하는 것이 좋습니다. 진행중인 문제는 다음과 같습니다.

stamps = ('5:00PM','2:00PM','7:00AM','8:45PM','12:00PM') 
DT_stamps = [DateTime(s) for s in stamps] 
DT_stamps.sort() 

구현 세부 사항은 학생을위한 연습 문제로 남습니다. :-)

+0

결과에 정렬 된 문자열 목록을 남기지 않습니다. – Soviut

+0

OP가 문자열이 아닌 시간의 목록으로 선언 했으므로이 압정을 선택했습니다. 진정한 문제가 문자열을 정렬하는 것이라면, 그 순간에 Real Soon Now에 대한 설명이 나옵니다. :-) – Prune

1

시간은 항상 형식으로하려는 경우, 당신은 하위에 시간을 나눌 수 있습니다.

당신이 중간에 끝의 두 글자, 또는 결장을 보장하지 않는 경우
def sortable_time(time_str): 
    time, day_half = time_str[:-2], time_str[-2:] 
    hour, minute = [int(t) for t in time.split(":")] 
    hour = hour % 12 
    return day_half, hour, minute 

# When sorting, use `key` to define the method we're sorting with 
# (The returned list however, will be filled with the original strings) 
result = sorted(your_time_list, key=sortable_time) 
#: ['7:00AM', '12:00PM', '2:00PM', '5:00PM', '8:45PM'] 

, 가장 위치 :

x = "12:30PM" 
# Use python's string slicing to split on the last two characters 
time, day_half = x[:-2], x[-2:] 
# Use python's string.split() function to get the difference between hours and minutes 
# Because "11" < "2" for strings, we need to convert them to integers 
hour, minute = [int(t) for t in time.split(":")] 
# Get the remainder because 12 should actually be 0 
hour = hour % 12 
# Output it as a tuple, which sorts based on each element from left to right 
sortable = (day_half, hour, minute) 
#: ("PM", 12, 30) 

는 같은 것을 사용 모두 마무리하려면 Prune에서 제안한 것과 같은 라이브러리를 사용하여 단지 표준 라이브러리와 python3에서

+0

답변 해 주셔서 감사합니다!표준 라이브러리 만 사용할 수 있다고 생각합니다. – alex756

+0

문제 없음 @ alex756이 답변 중 하나라도 도움이 되었으면, 그 중 하나를 upvote하고 표시하여 다른 사람들이 답변을 찾을 수 있도록 올바른 것을 표시하십시오. – SCB

1

:

시간의 목록이 아닙니다 당신이 보여주는 것
import time 
hours = ('5:00PM','2:00PM','7:00AM','8:45PM','12:00PM') 
format = '%I:%M%p' 
time_hours = [time.strptime(t, format) for t in hours] 
result = [time.strftime(format, h) for h in sorted(time_hours)] 
assert result == ['07:00AM', '12:00PM', '02:00PM', '05:00PM', '08:45PM'] 
0

, 그것은 문자열의 튜플입니다. 튜플은 변경 불가능하고 정렬 할 수 없으며 목록과 같은 변경 가능한 모음 만 가능합니다. 그래서 일단 당신은 목록에 튜플을 변환해야합니다

times = ['5:00PM','2:00PM','7:00AM','8:45PM','12:00PM'] 

는 이제이 목록을 정렬 시도 할 수 있지만, 문자열은 예상대로 정렬 할 것입니다. 대신 목록의 값을 struct_time 개체로 임시 변환하고이를 사용하여 정렬하는 사용자 지정 정렬 함수를 만들어야합니다.

import time 

time_format = '%I:%M%p' # match hours, minutes and AM/PM 

def compare_as_time(time_str1, time_str2): 
    # parse time strings to time objects 
    time1 = time.strptime(time_str1, time_format) 
    time2 = time.strptime(time_str2, time_format) 

    # return comparison, sort expects -1, 1 or 0 to determine order 
    if time1 < time2: 
     return -1 
    elif time1 > time2: 
     return 1 
    else: 
     return 0 

이제 sorted()를 호출 목록 및 사용자 정의 비교 함수에 전달하고 당신은 그 문자열의 시간으로 분류, 문자열 목록을 다시 얻을 것이다 할 수

sorted_times = sorted(times, compare_as_time) 

주 파이썬 3 : 앞의 예는 파이썬 3를 사용하는 경우, 당신이 key function에 비교 함수를 변환해야합니다 파이썬 2를 가정합니다. 다음과 같이 functools.cmp_to_key()을 사용하여 수행 할 수 있습니다.

form functools import cmp_to_key 

sorted_times = sorted(times, key=cmp_to_key(compare_as_time)) 
+0

파이썬 2에서도'key' 함수 만 지정할 수 있습니다. 간단하게 함수를 단순화 할 것이다.'sorted (times, key = lambda x : time.strptime (x, time_format))'. 참고 : 실제로'lambdas '는 마음에 들지 않지만 주석에서'def' 함수는 어렵습니다. – MSeifert

+0

필자는 맞춤형 비교 프로그램을 사용하여 정렬하는 방법을 설명하기 위해 의도적으로이 코드를 작성했습니다. OP는 이것을 배우고 적용하려고 시도하므로 한 라이너가 도움이되지 않습니다. – Soviut

+0

제거 된 기능을 설명하는 것이 도움이된다고 생각한다면 ('cmp'는 Python3에서 삭제되었습니다), python2에서만 작동한다는 경고를 추가하십시오. OP는 자신의 버전을 지정하지 않았으므로 적어도 자신의 대답이 자신에게 맞지 않을 가능성이 높습니다. :-) – MSeifert

관련 문제