2017-11-01 12 views
0

私はオブジェクトのリストを持っていますが、私はオブジェクトの属性(例えば、名前)からそのリストのオブジェクトのインデックスを取得しようとしています。以下の例のようなものに似て:今、私はのインデックスを取得しようとしているオブジェクトの属性の1つを持つオブジェクトのリストからインデックスを取得

class Employee: 
    def __init__(self, name): 
     self.name = name 

def add_emp(name): 
    employees.append(Employee(name)) 

employees = [] 
add_emp('Emp1') 

「EMP1」リストでself.employees(ここでは「0」)。

print(employees.index(filter(lambda x: x.name == 'Emp1', employees))) 

が、彼は と言われます:私はここにこれを試してみました:「とValueError 0xblablaで<フィルタオブジェクト>はリストにありません」。私は何を変えなければならないのですか、これを処理するにはより良い選択肢がありますか?

+0

'enumerate'関数を使うことができます。' i、o'の形式でタプルのイテレータを返します。ここで 'i'はインデックス、' o'は実際のオブジェクトです。 – dcg

+0

@dcg私はこの 'enumerate(employees)'を試してみましたが、これは私にこれを与えました: '<0xblablaでオブジェクトを列挙> – watschen

+0

@hkzlそれを反復する必要があります – dcg

答えて

0

フィルタ自体を検索しないで、フィルタが何であるかを検索すると、が見つかります。たとえば、filter(...)の代わりにnext(filter(...))とします。

しかし、実際に、より良いだけenumerateを使用します。

print(next(i for i, x in enumerate(employees) if x.name == 'Emp1')) 

それとも、名前のリストを作成し、インデックスのためにそれを求めることができる:

print([x.name for x in employees].index('Emp1')) 

それはしかし、あまり効率的です。

+0

あなたと@ettananyの答えはどちらも完璧にうまくいきますが、これは1行で作業しますので、私はこれを受け入れられた答えと見なしました。ありがとう、たくさんの人! – watschen

0

filter()は、フィルタオブジェクトを返すアプローチは、リストに変換されるだろうと、インデックス0を持つ要素を取るので:

print(employees.index(list(filter(lambda x: x.name == 'Emp1', employees))[0])) 

しかし、最善のアプローチは、enumerate()を使用することになります。

def get_employee_index(name): 
    for i, e in enumerate(employees): 
     if e.name == name: 
      return i 
    return -1 # for not found employee 

出力:

>>> get_employee_index('Emp1') 
0 
+0

最初のアプローチは、 *リストの索引が範囲外であることに不満を表明したので、私のために働いています。しかし、あなたと他の人がとにかくより良いと述べた2番目の選択肢は、完璧に働いていました。どうもありがとう! – watschen

関連する問題