0

クラス インスタンスの完全なリストから始めて、属性値に関するいくつかの条件を満たすクラス インスタンスのサブリストを作成するにはどうすればよいですか?

たとえば、クラス Person() のインスタンスのリストがあります。これらの人は多くの属性を持っており、そのうちの一意の識別子である ID と、住んでいる世帯の識別子である HH_ID があります。同じ世帯に住んでいて、同じ HH_ID を持つすべての人を接続したいと考えています。「つながる」とは、 を使用して、すべての世帯メンバー間にエッジを作成することを意味しnetworkxます。これを行うには、これらの人を特定して「サブリスト」に入れ、何らかのアルゴリズムで処理してそれらをすべて結び付ける必要があります。どうすればこれを達成できますか?

他のより複雑な目的のためにこれを行うための一般的なツールも必要です (たとえば、15 歳から 20 歳までの N 人をランダムに接続するなど)。 HH_ID したがって、次のようなものがあります。

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

ここで、最初の世帯は [0,1,2] の人で構成され、2 番目の世帯は [3,4] の人で構成されます...

この家庭の問題については、pairwiseイテレータ レシピを使用してみました ( itertools のドキュメントは次のようになります。

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

しかし、明らかにこれは機能しません。私の反復子は、隣接する 2 人の人物が一致しなくiなるまで停止し、そこから次の人のために再開するからです。hh_idたとえば、上記の例の人物の場合、forループで人物 1 になると、イテレーターは人物 2 と 3 の比較を開始しますが、for ループで人物 3 に直接ジャンプしてイテレーターを開始させる何らかの方法が必要になります。人物 3 と 4 を比較します。あまり明確に見えなくても、この例が少し明確になることを願っています...

より一般的には、属性値に関するいくつかの条件を満たす人のサブリストを作成する方法、おそらく効率的な方法が必要です (私は約 150000 人を持っています)。

4

1 に答える 1

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

より複雑な目的の場合は、キー関数を変更して、グループ化する項目に対して同じ値を返すようにします。

編集:エラーを修正:だけでなくgroupbyタプルを返します。(key, group_iter)group_iter

于 2012-05-18T11:15:02.853 に答える