2011-08-11 4 views
4

여러 필드가있는 사용자 지정 개체를 정의했습니다.여러 목록에서 개체의 고유 목록 만들기

예를 들어 이름, ID 및 연령으로 구성된 학생 개체가 있다고 가정 해보십시오. 두 학생을 비교하여 그들이 같은 학생인지 아닌지를 결정하기 위해 두 학생의 나이, 이름 및 ID가 일치하는지 여부를 반환하는 __ eq__ 메소드를 구현했습니다.

 
def __eq__(self, other): 
    return self.name == other.name and self.ID == other.ID and self.age == other.age 

학생들은 학생 일 뿐이므로 학생 ID가 고유하다고 생각한다는 사실을 고려하십시오.

가정하자 나는 학생의 임의의 수 다음과 같은 등록 목록

 
[S1, S2, S3] 
[S2, S3] 
[S3, S5, S4] 
[S1, S4, S2, S1] 

나는 다음과 같은 요소를에

 
S1, S2, S3, S4, S5 

간단한 방법을 포함 할 일부 데이터 구조를 만들 것입니다 오브젝트있다 물건을 많이 잡을 수있는 데이터 구조를 초기화하고, 항목을 잡고, 구조에 있는지 여부를 확인하고, 그렇지 않은 경우 추가하는 것입니다. 나는 간단한 목록으로 그것을 구현하기로 결정하면 내 목록 성장을 계속

 
new_list = some_new_list 
for each list of students: 
    for each student in the list: 
    check if the student is in new_list 
    #decide what to do 

, 나는 잠재적 내가 학생들과 등록 목록의 말도 안되는 금액을 가지고 특히, 비교를 많이 만들 수 있습니다.

효과적인 구현 방법은 무엇입니까? 둘 다 두 객체를 비교 한 다음 해당 비교 메소드를 사용하여 고유 한 객체 세트를 생성합니다.

편집 : 간단한 구현을 시도했습니다.

 
>>>a = Student("sample", 1234, 18) 
>>>b = Student("sample", 1234, 18) 
>>>students = set() 
>>>students.add(a) 
>>>b in students 
False 
>>>b == a 
True 

내가 잘못 했나요?

+2

왜 사용하지를 내장 세트의 형태? 회원 테스트는 순수 Python에서 기대하는 것보다 훨씬 효율적입니다. –

+0

@omrib 따라서 각 학생 목록을 반복 한 다음 newSet.add (student)를 호출하는 것은 좋은 결과입니다. – MxyL

+0

@agf, 오, 나는 아이템이 세트에 존재하는지 아닌지를 체크하는 것만으로 충분하다고 생각했다. 예 : "회원 테스트" – MxyL

답변

8
from itertools import chain 
myset = set(chain(iterable1, iterable2, iterable3, iterable4)) 

Here are the docs for sets

을 설정, 당신은 각이 한 번 반복 가능한 반복. chain은 일련의 iterable에서 하나의 long iterable을 만듭니다. 정렬이 필요하면 sorted(myset)이 정렬 목록을 제공합니다.

귀하의 Student 클래스는 __eq__의와 호환되는 __hash__ 구현해야 :

def __hash__(self): 
    return (self.name, self.ID, self.age).__hash__() 
+0

학생 목록의 수가 다양 할 경우 (모두 'student_lists'라고하는 목록 또는 튜플에 포함되어 있음),'set (chain (* student_lists)) '를 사용할 수 있습니다. –

+0

@omrib'set (chain.from_iterable (student_lists))'를 사용하십시오. 그래서'student_lists'을 풀어서는 안됩니다. 누구든지'itertools.chain'에'map'과'zip'과는 달리 그것을 생각했다. – agf

+0

팁 주셔서 감사합니다! itertools에 대한 나의 지식을 새롭게 할 시간 ... –

-2

한 마디 만 남았습니다.

당신은 독특한 아이템을 얻을

관련 문제