0

クラスの単純なオブジェクトを含むリストがあります。Person ie:

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

これPerson objectは非常に単純で、さまざまな変数、値があります。

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

ご覧Personのとおり、これらはすべて、アパート、家、またはボートのいずれかに住んでいます。

私が作成したいのは、新しい list、または辞書(どちらでもかまいませ) で、このリストが lives_in 値でグループ化され、最も人口の多い選択肢が新しいリストの一番になるように並べ替えられています。 (または、lives_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 に答える