2012-05-18 5 views
0

Как создать подсписчик экземпляров класса, удовлетворяющих некоторому условию их значений атрибутов, начиная с полного списка экземпляров класса?Создайте список экземпляров классов, удовлетворяющих некоторому условию их значений (ов) атрибутов

Например, у меня есть список экземпляров моего класса Person(). Эти люди имеют много атрибутов, среди которых идентификатор, уникальный идентификатор и HH_ID, идентификатор домашнего хозяйства, в котором они живут. Я хочу связать всех лиц, живущих в одном доме, и, следовательно, иметь тот же HH_ID. Под «connect» я подразумеваю создание края между всеми членами домохозяйства, используя 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 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 и 3, когда дело доходит до человека 1 в цикле for, в то время как мне нужно будет каким-то образом перейти непосредственно к человеку 3 в цикле for и запустить мой итератор сравнивая человека 3 и 4. Надеюсь, что этот пример немного прояснится, даже если он не выглядит очень ясным ...

В общем, мне нужен способ создания подсписного списка лиц, удовлетворяющих некоторым условиям по их атрибуту значения, возможно, является эффективным способом (у меня есть около 150 тысяч человек)

ответ

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 

для более сложных целей, просто изменить функцию кнопки, чтобы вернуть то же значение для тех элементов, которые Wa nt для группировки.

EDIT: Исправлена ​​ошибка: groupby возвращает кортеж (key, group_iter), а не только group_iter.

+0

Спасибо, эта группа сначала была не очень понятна, но это именно то, что я искал! – Wilco

 Смежные вопросы

  • Нет связанных вопросов^_^