2017-01-25 4 views
0

안녕 얘들 아, 숙제에 대한인스턴스와 거품 정렬 사용 방법

내가 '등록', '색상', '제조'와 같은 특정 매개 변수 구성 '자동차'라는 클래스를 구현해야 '모델 '출력 및 비교 방법과 함께. 이 후 나는 '제조업체'와 '모델'별로 이러한 인스턴스를 정렬하기 위해 버블 정렬을 구현해야한다. 다른 속성은 무시할 수 있습니다. 지금까지

내 코드 : 내가 지금 무엇을해야

def class car(): 
    self.__init__(self, registration, color, manufacturer, model): 
     self.registration = registration 
     self.color = color 
     self.manufacturer = manufacturer 
     self.model = model 
    def output(self): 
     return '{}{}{}{}'.format(self.registration, self.color, self. manufacturer, self.model) 

    def bubblesort(list_1): 
     for k in range(len(list_1)-1, 0, -1): 
      for i in range(0,k): 
       if list_1[i] > list[i+1]: 
        list_1[i], list_1[i+1] = list_1[i+1], list_1[i] 
     return list_1 

두이 같은 자동차의 인스턴스를 만들 수 있습니다 :

instance = [Car(2003, 'black', 'BMW', 'M4') 
      Car(2005, 'red', 'Audi', 'Q3') 
      Car(2010, 'green', 'BMW', 'X1') 
      Car(2007, 'pink', 'Subaru', 'BRZ')] 
      Car(1998, 'black', 'Audi', 'Q5') 

및 정렬 후에는 다음과 같이한다 :

[Car(2005, 'red', 'Audi', 'Q3') 
Car(1998, 'black', 'Audi', 'Q5') 
Car(2003, 'black', 'BMW', 'M4') 
Car(2010, 'green', 'BMW', 'X1') 
Car(2007, 'pink', 'Subaru', 'BRZ')] 

그래서 나는 모든 것을 가지고 있지만 '전체 인스턴스'를 어떻게 정렬해야할지 모르겠다. 실제로 나는 심지어 kn도하지 않는다. 아,이 말을 할 수 있다면 ... : D

어쩌면 여러분 중 일부가 나를 도울 수 있습니다. 감사.

+0

오, SRY - 거품 정렬에 잘못된 인수를 전달! 실제로 그것은 bubblesort (list_1)라고 불립니다. 나는 그것을 편집 할 것입니다; 감사! –

+0

그래서 실제로 list_1은 인스턴스 목록을 포함하는 인스턴스입니다. 나는 OOP에 대해 매우 익숙해 져서 나의 나쁜 표현을 변명한다./ –

+0

이 코드는 유효한 Python 구문이 아니다. –

답변

0

비교할 수있는 것, 즉 다른 것보다 "적은 것"이라고 생각할 수있는 것만 정렬 할 수 있습니다.

자동차의 경우 모델 이름, 연도 등 또는 이들의 조합 일 수 있습니다.

개체를 비교할 수있게 만들려면 __lt__ (보다 작음) 및 __eq__ (같음)과 같은 메서드를 구현해야합니다.

그러나 클래스는 많은 수의 불변 필드 (일반적으로 좋음) 인 것처럼 보입니다. namedtuple을 사용하면 클래스를 만들고 비교 메소드 구현을 제공합니다. 그것으로, 당신의 차는 선언 된 첫 번째 필드에 의해 정렬되고 두 번째 등으로 정렬 될 것입니다.

또한 bubblesort 메소드는 자동차의 인스턴스 데이터를 전혀 사용하지 않기 때문에 Car 클래스에 속하지 않습니다. 독립 실행 형 함수 여야합니다.

+0

그 이유는 내가이 플랫폼을 너무 좋아하기 때문입니다! 불행히도 나는 모든 것을 구현하는 법을 모르겠다. 충고에 감사한다. 나는 물건을 실행 시키려고 노력할 것이다. :) –

1

다음은 필요한 작업을 수행하는 샘플 코드입니다. 비교 연산자가 오버로드되었습니다 (비교 논리를 추측했습니다).

class Car(object): 
    def __init__(self, registration, color, manufacturer, model): 
     self.registration = registration 
     self.color = color 
     self.manufacturer = manufacturer 
     self.model = model 

    def __str__(self): 
     return '{}\t{}\t{}\t{}'.format(self.registration, self.color, self. manufacturer, self.model) 

    def __gt__(self, other): 
     if isinstance(other, Car): 
      if self.manufacturer != other.manufacturer: 
       return self.manufacturer.lower() > other.manufacturer.lower() 
      else: 
       return self.model.lower() > other.model.lower() 

def bubblesort(list_1): 
    for k in range(len(list_1)-1, 0, -1): 
     for i in range(0,k): 
      if list_1[i] > list_1[i+1]: 
       list_1[i], list_1[i+1] = list_1[i+1], list_1[i] 
    return list_1 

instance = [Car(2003, 'black', 'BMW', 'M4'), 
      Car(2005, 'red', 'Audi', 'Q3'), 
      Car(2010, 'green', 'BMW', 'X1'), 
      Car(2007, 'pink', 'Subaru', 'BRZ'), 
      Car(1998, 'black', 'Audi', 'Q5')] 

sorted_instance = bubblesort(instance) 
for item in sorted_instance: 
    print(str(item)) 
+0

'__eq__'의 논리를'return (self.manufacturer. lower(), self.model.lower()) == (other.manufacturer.lower(), other.model.lower())'. 같은 것을'__gt__'에 적용하면'=='을'>'로 바꾸면됩니다. 터플 클래스가 나머지를 처리합니다. 당신이 묘사 한 방식으로 – 9000

+0

우 ~. 감사합니다! 당신이 __gt__ 방법이 어떻게 작동하는지 설명하기 위해 그것은 가능겠습니까? 알아두면 좋을 것입니다. 지금부터 사용해 볼 수 있습니다 :) 감사합니다. –

+0

파이썬 인터프리터가 비교 연산자에서 넘어 질 때마다 ">"("보다 큼") __gt__ 함수가 실행됩니다 (예 : 여기의 list_1 [i]). 연산자의 오른쪽 값 (여기에서 list_1 [i + 1])은 "다른"인수입니다. – aldarel

관련 문제