0

人々のリストがあるとしましょう。

class Person:
    def __init___(self, name, id):
        self.name = name
        self.id = id

people = []
for x in xrange(0,100)
    #find people and append to people list

今、私は人々のオブジェクトのリストを持っています。たとえば、人のリストから「Bob」という名前の人を最も効率的に見つけるにはどうすればよいでしょうか。

4

3 に答える 3

4

リストだけで他のインデックスがない場合は、リスト内包表記を使用する必要があります。

matching = [p for p in people if p.name == 'Bob']

ただし、それを頻繁に行う必要がある場合は、インデックスを作成することをお勧めします。

from collections import defaultdict

nameindex = defaultdict(list)
for person in people:
    nameindex[person.name.lower()] = person

nameindex['bob']  # a list of people named Bob.

この方法では、すべての人を 1 回 (コスト O(N)) ループするだけでよく、その後は名前検索のコストが一定 (O(1)) になります。

于 2012-09-08T20:12:01.520 に答える
1

この正確なシナリオでは、辞書を使用する必要があります。

from collections import defaultdict
people = [...]
name_to_people = defaultdict(list)
for p in people:
    name_to_people[p.name].append(p)

次に、名前が「Bob」であるすべての人を検索したいときはいつでも:

bobs = name_to_people["Bob"]

一致しない場合は空のリストを返し、その名前を持つ人物が 1 人だけの場合は 1 つの要素を持つリストを返し、複数のボブがいる場合は複数の要素を持つリストを返します。

于 2012-09-08T20:13:00.480 に答える
0

これを行う1つの方法は、人のオブジェクトのコレクションを保持するクラスを作成することです。これを行うための最良の方法の1つは、次のコードのようなものです。

class People:
    def __init__(self):
        self.members = {}

    def add_person(self, person):
        self.members[person.name] = person

    def __getitem__(self, name):
        return self.members[name]

class Person:
    def __init__(self, name, id):
        self.name = name
        self.id = id

これで、Peopleオブジェクトを次のように埋めることができるはずです。

# Add people to a People object
people = People()
people.add_person(Person('Bob', 1))
people.add_person(Person('Surly', 2))

# Get a person by their name
people['Bob']    # Returns instance that is People('Bob', 1)

また、お知らせするために、Personクラスの__init__メソッドにはアンダースコアが多すぎると思います。お役に立てれば。

于 2012-09-08T20:29:18.617 に答える