创建满足某些(s)值条件的类实例列表

时间:2012-05-18 11:06:22

标签: python oop list iteration agent-based-modeling

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

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

我还需要一个通用工具来实现其他更复杂的目的(例如,随机连接15岁至20岁的N人),但在家庭成员最简单的情况下,我可以使用我的清单被订购的事实通过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 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不匹配,并从那里为下一个人重新开始。例如。对于上面例子中的人,我的迭代器将开始比较人{2}和{1}}循环中的人1,而我需要一些方法直接跳转到for循环中的人3让我的迭代器开始比较第3和第4人。 我希望这个例子能够澄清一点,即使它看起来不太清楚......

更一般地说,我需要一种方法来创建满足某些条件属性值的人员子列表,这可能是一种有效的方式(我有大约150000人)

1 个答案:

答案 0 :(得分: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