0

如何从类实例的完整列表开始创建满足其属性值某些条件的类实例的子列表?

例如,我有一个我的类 Person() 的实例列表。这些人有很多属性,其中 ID 是唯一标识符,HH_ID 是他们居住的家庭的标识符。我想连接生活在同一家庭中的所有人,因此具有相同的 HH_ID。通过“连接”,我的意思是在所有家庭成员之间使用networkx. 为了做到这一点,我需要识别这些人并将它们放在“子列表”中,以便通过某种算法进行处理,将它们连接在一起。我怎样才能做到这一点?

我还需要一个通用工具来为其他更复杂的目的执行此操作(例如,随机连接 N 个 15 到 20 岁的人),但在家庭成员最简单的情况下,我可以使用我的列表按 ID 排序的事实和HH_ID,因此我有类似的东西:

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

其中第一个家庭由人 [0,1,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

但显然这不起作用,因为我的迭代器i下降,直到hh_id两个相邻的人不匹配,然后从那里重新开始下一个人。例如,对于上面示例中的人员,当涉及到循环中的人员 1 时,我的迭代器将开始比较人员 2 和人员 3 for,而我需要某种方式直接跳转到 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

对于更复杂的目的,只需更改键函数以为要分组的那些项目返回相同的值。

EDIT: Fixed error: groupby returns a tuple (key, group_iter), not just group_iter.

于 2012-05-18T11:15:02.853 回答