2012-05-18 5 views
0

클래스 인스턴스의 전체 목록에서 시작하여 속성 값에 대한 조건을 만족하는 클래스 인스턴스의 하위 목록을 만들려면 어떻게해야합니까?속성 값에 대한 조건을 만족하는 클래스 인스턴스 목록 만들기

예를 들어, 클래스 Person()의 인스턴스 목록이 있습니다. 이 사람들은 여러 가지 속성을 가지고 있는데 그 중 고유 식별자 인 ID와 거주하는 가구의 식별자 인 HH_ID가 있습니다. 동일한 세대에 거주하는 모든 사람을 연결하고자하므로 같은 HH_ID를 가지고 있습니다. "연결"이란, networkx을 사용하여 모든 세대 구성원간에 우위를 차지하는 것을 의미합니다. 이 작업을 수행하려면이 사람들을 식별하고 이들을 모두 연결하는 알고리즘으로 처리하기 위해 이들을 "하위 목록"에 넣어야합니다. 이것을 어떻게 할 수 있습니까?

다른보다 복잡한 목적 (예 : 15 세에서 20 세까지의 N 명을 무작위로 연결)을 위해 일반적인 도구가 필요하지만 가장 쉬운 경우에는 내 목록이 ID와 HH_ID 발주 따라서 I 같은 것을 가지고 제 생활이 명 [0,1,2], 사람 [3,4] 등의 두 번째 구성된다

ID HH_ID 
0 0 
1 0 
2 0 
3 1 
4 1 
5 2 

을 ...

이 가정용 문제에 대해서는 pairwise 반복자 레시피를 사용해 보았습니다 (itertools documentation :

).
import pairwise 
i = pairwise(personList) 
for p in personList: 
    toConnectList = [p] 
    p1,p2 = i.next() 
    while p1.hh_id == p2_hh_id 
     toConnectList.append(p2) 
     p1,p2 = i.next() 
     # connect all persons in toConnectList 

그러나분명이 작동하지 않습니다, 내 반복자 i 아래로 다음 사람을 위해 거기에서 두 개의 인접한 일치하지 않는 사람, 그리고 다시 시작의 hh_id까지갑니다. 예 : 위의 예제에서 반복자는 for 루프의 사람 1에 대해 사람 2와 3을 비교하기 시작합니다. for 루프에서 사람 3에게 직접 건너 뛰고 반복기를 시작해야 할 몇 가지 방법이 필요합니다. 사람 3과 4를 비교하십시오. 이 예제가 명확하지 않은 경우에도 조금 명확하게 보이기를 바랍니다.

더 일반적으로, 나는 그 속성에 대한 몇 가지 조건을 만족하는 사람의 하위 목록을 만드는 방법이 필요합니다 값, 아마도 효율적인 방법 (I 주위 150000 사람이) 더 복잡한 목적

답변

2
from itertools import groupby 

def family_key(person): 
    return person.HH_ID 

persons.sort(key=family_key) 
for hh_id, family in groupby(persons, key=family_key): 
    for person in family: 
     # do your thing 

, 당신 해당 항목 w에 대해 동일한 값을 반환 키 기능을 변경할 그룹으로 개미.

편집 : 고정 오류 : 튜플 (key, group_iter) 아니라 group_iter을 반환 groupby.

+0

감사합니다.이 groupby는 처음에는 분명하지 않았지만 정확히 내가 찾고 있던 것이 었습니다! – Wilco