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

时间:2012-10-27 04:17:29

标签: python python-2.7

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

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

这个Person object非常简单,有各种变量,值如:

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

正如你所看到的,所有这些Person生活在某处,无论是公寓,房屋还是船只。

我要创建的是新列表,或者字典重要吗?)我有 >列出排序的方式是按其lives_in值分组,最常填充的选项是新列表中的第一个(或字典,in life_in值将是关键)。

E.g:

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

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

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

3 个答案:

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

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

答案 2 :(得分:2)

假设您的人员列表在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]]))