如何在Python中对此列表进行排序?

Phi*_*hil 0 python python-2.7

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

my_list [Person<obj>, Person<obj> ..]
Run Code Online (Sandbox Code Playgroud)

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

Person_n.name = 'Philip'
Person_n.height = '180'
Person_n.lives_in = 'apartment' 
Run Code Online (Sandbox Code Playgroud)

所以你可以看到,所有这些都Person住在某处,无论是公寓,房屋还是船.

我想创建一个新的列表,或字典(也不能不管哪个),其中我有这个列表排序的方式,他们通过自己的lives_in值进行分组人口最多的选择是一把手在新的列表(或字典,其中lives_in值将是关键).

例如:

new_list = [('apartment', [Person_1, Person_5, Person_6, Person_4]), ('house': [Person_2, Peson_7]), ('boat': [Person_3])]
Run Code Online (Sandbox Code Playgroud)

我是Python的新手,我遇到了无休止的循环.必须有一种简单的方法来做到这一点,而不需要循环4次.

什么是Pythonic方法来实现这个理想的新列表?

K Z*_*K Z 7

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

sorted_list = sorted(my_list, key=lambda x: x.lives_in)
Run Code Online (Sandbox Code Playgroud)

然后使用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)]
Run Code Online (Sandbox Code Playgroud)