我有一个列表,其中包含一个类的简单对象,比如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方法是什么?
答案 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]]))