Python 은 학생 연령 에 따라 순 위 를 매 기 는 실제 문제 에 대한 상세 한 설명 을 실현 합 니 다.

4762 단어 python나이.정렬
머리말
본 고 는 주로 Python 을 이용 하여 학생 의 연령 에 따라 순 위 를 매 기 는 것 과 관련 된 내용 을 공유 하여 여러분 에 게 참고 학습 을 제공 합 니 다.다음은 더 이상 말 하지 않 겠 습 니 다.상세 한 소 개 를 살 펴 보 겠 습 니 다.
질문:클래스 정의:이름 name,성별 gender,나이 age 를 포함 하여 나이 에 따라 학생 들 에 게 순 위 를 매 겨 야 합 니 다.
입력:학생 대상 을 포함 하 는 List.
출력:나이 에 따라 정렬 된 List.
사고방식 1:거품 순 서 를 사용 하여 비교적 인접 한 학생 들 이 첫 번 째 학생 의 age 값 이 두 번 째 학생 의 age 값 보다 크 면 전체적으로 이 두 요 소 를 교환한다.매번 점점 적어 지 는 요소 에 대해 위의 절 차 를 반복 합 니 다.한 쌍 의 학생 도 비교 할 필요 가 없 을 때 까지.
사고방식 2:Python 을 사용 하여 천천히ǚ피망 sorted().
(이 문 제 는 필자 가 면접 을 볼 때 손 으로 쓴 실제 문제 로 소 백 을 대상 으로 한다.우 리 는 이런 간단 한 문 제 를 통 해 Python 의 기초 지식 을 복습 할 수 있다)
1.사전 준비
1.1 정의 클래스

class Student(object):
 def __init__(self, name, gender, age):
 self.__name = name
 self.__gender = gender
 self.__age = age
 
 #   age  
 def getAge(self):
 return self.__age
 
 #   
 def printStudent(self):
 return self.__name, self.__gender, self.__age
1.2 무 작위 학생 대상 을 포함 하 는 List 생 성

#            list
def generateStudent(num):
 # num           
 list = []
 for i in range(num):
 randName = ''.join(random.sample(string.ascii_letters, 4))
 randGender = random.choice(['Male', 'FeMale'])
 randAge = random.randint(10,30)
 s = Student(randName, randGender, randAge)
 list.append(s)
 return list
2.정렬 시작
2.1 거품 정렬 사용
사고 방향 은 이미 처음에 소개 되 었 고 우 리 는 코드 를 직접 보 았 다.

def sortStudent(list):
 for i in range(len(list)):
 for j in range(1, len(list)-i):
  if list[j-1].getAge() > list[j].getAge():
  list[j-1], list[j] = list[j], list[j-1]
 return list
2.2 파 이 썬 을 사용한다ǚ피망 정렬
lambda 표현 식 에 맞 춰 사용 합 니 다.매우 간결 합 니 다.코드 는 다음 과 같 습 니 다.

sorted(list, key=lambda student: student.getAge()) #     age       Key
sorted()와 lambda 표현 식 에 관 한 지식 을 보충 합 니 다.
2.2.1 sorted(iterable, *, key=None, reverse=False)
공식 문서
매개 변수 에 대한 설명:
key specifies a function of one argument that is used to extract a comparison key from each list element: key=str.lower. The default value is None (compare the elements directly).
reverse is a boolean value. If set to True, then the list elements are sorted as if each comparison were reversed.
  • key 에서 받 은 것 은 특정한 함수(예 를 들 어 lambda 함수)가 되 돌아 오 는 값 으로 지정 한 비교 근거 로 할 수 있 습 니 다.
  • reverse 는 기본적으로 False 가 작은 것 에서 큰 것 으로 정렬 되 고 True 로 설정 하면 큰 것 에서 작은 것 으로 설정 할 수 있 습 니 다.
  • 안정성 에 대한 설명:
    The built-in sorted() function is guaranteed to be stable.
    (공식 문 서 를 본 설명 에 따 르 면 이 방법 은 안정 을 보장 합 니 다!)
    원리:Python 에 내 장 된 sorted()방법 뒤에 사 용 된 것 은 Timsort 알고리즘 입 니 다.데이터 가 Ordered Data 에 가 까 울 수록 시간 복잡 도 는 O(N)에 가 깝 습 니 다.우리 의 이 문제 에서 연령 속성 은 Ordered Data 에 비교적 부합된다.관심 있 는 것 은 Timsort 를 클릭 하여 더 많은 것 을 볼 수 있 습 니 다!
    2.2.2 lambda 표현 식
    그냥 간단 한 예 를 보시 면 아 실 거 예요.
    
    >>> pairs = [('one',1),('two',2),('three',3),('five',5),('zero',0),('four',4)]
    >>> sorted(pairs, key=lambda pair: pair[1]) # List   tuple       tuple   2  
    [('zero', 0), ('one', 1), ('two', 2), ('three', 3), ('four', 4), ('five', 5)] 
    3.테스트 수행
    테스트 용 무 작위 데 이 터 를 구축 하여 두 가지 방법의 실행 시간 을 계산 하여 비교 합 니 다~
    
    if __name__ == '__main__':
    
     # list    [('hZDw', 'FeMale', 17)...]
     list = generateStudent(10000)
    
     #   1:      
     start_Time1 = time.time()
     sortStudent(list)
     end_Time1 = time.time()
     #   1 ,  10000           22.243   (   )
     print('%s cost time %s' % ('sortStudent' , end_Time1 - start_Time1))
    
    
     #   2:  Python   sorted  +lambda   
     #   sorted       timsort  ,      Ordered data   ,        O(N)。
     #        ,         Ordered data 。
     start_Time2 = time.time()
     sorted(list, key=lambda student: student.getAge()) #            Key
     end_Time2 = time.time()
     print('%s cost time %s' % ('sorted' , end_Time2 - start_Time2))
    테스트 결과:
    사용 방법 1(거품 정렬),테스트 데이터 가 10000 개 일 때 정렬 시간 은 22.243 초 정도 입 니 다.
    사용법 2(천천히ǚ고추.ǎ,테스트 데이터 가 1000000 개 일 때 정렬 시간의 0.575 초 정도 입 니 다.
    정확 하 지 는 않 지만 차 이 는 분명 보 입 니 다!
    이상
    잘못 이 있 으 면 지적 해 주세요~
    전체 구현 및 테스트 는 Github 에서 찾 을 수 있 습 니 다:ActualProblem-Solution
    총결산
    이상 은 이 글 의 전체 내용 입 니 다.본 논문 의 내용 이 여러분 의 학습 이나 업무 에 어느 정도 도움 이 되 기 를 바 랍 니 다.궁금 한 점 이 있 으 시 면 댓 글 을 남 겨 주 셔 서 저희 에 대한 지지 에 감 사 드 립 니 다.

    좋은 웹페이지 즐겨찾기