0

我有一个列表,其中包含一个简单的类对象,比如 Person 即:

my_list [Person<obj>, Person<obj> ..]

Person object很简单,有各种变量,值,即:

Person_n.name = 'Philip'
Person_n.height = '180'
Person_n.lives_in = 'apartment' 

如您所见,所有这些都Person生活在某个地方,无论是:公寓、房屋还是船。

我要创建的是一个新列表,或者一个字典不管是哪个),我在其中对这个列表进行了排序,它们按它们的生活值分组,并且人口最多的选择是新列表中的第一名(或字典,其中 living_in 值将是关键)。

例如:

new_list = [('apartment', [Person_1, Person_5, Person_6, Person_4]), ('house': [Person_2, Peson_7]), ('boat': [Person_3])]

我是 Python 新手,我陷入了无限循环。必须有一种简单的方法来做到这一点,而无需循环 4 次。

实现这个所需的新列表的 Pythonic 方法是什么?

4

3 回答 3

7

您需要先对其进行排序,然后再将其传递给groupby

sorted_list = sorted(my_list, key=lambda x: x.lives_in)

然后使用itertools.groupby

from itertools import groupby

groupby(sorted_list, key=lambda x: x.lives_in)
result = [(key, list(group)) \
        for key, group in groupby(sorted_list, key=lambda x: x.lives_in)]
于 2012-10-27T04:24:08.443 回答
3
people = my_list_of_people
people.sort(key=operator.attrgetter('lives_in')) # sort the people by where they live
groups = itertools.groupby(people, key=operator.attrgetter('lives_in')) # group the sorted people by where they live
于 2012-10-27T04:21:47.400 回答
2

假设您的 Person 列表在myList并且您想要创建newList. 我对堆栈溢出有点陌生,所以我不使用制表符。有人可以帮助我大声笑。但这里的代码:

for i in xrange(len(myList)):
     found = false;
     for j in xrange(len(newList)):
          if newList[j][0]==myList[i].lives_in:
                found = true;
                 newList[j][1].append(myList[i]);
     if !found:
          newList.append((myList[i].lives_in, [myList[i]]))
于 2012-10-27T04:25:41.013 回答