2011-11-18 53 views
4
def myFunction(name): 
    index = 0 
    list = self.getList() 
    index = (x => x.name == name) 
    return index 

我想使用lamba表達式在Python列表中查找元素的索引,就像在C#中一樣。是否有可能像在C#中一樣使用lambda表達式來查找python列表中特定元素的索引。如果是這樣,請在Python已經內置功能Python列表操作,Lambda表達式

>>> a = ['foo','bar','buz'] 
>>> a.index('bar') 
1 
>>> a.index('foo') 
0 
+0

是您'list'標準的Python列表或一個對象? – Shamanu4

+0

您能否提供一個更完整的示例來說明您想要做什麼,並提供示例輸入和輸出? –

回答

3

我認爲這個代碼更接近你所要求的:

def indexMatching(seq, condition): 
    for i,x in enumerate(seq): 
     if condition(x): 
      return i 
    return -1 

class Z(object): 
    def __init__(self, name): 
     self.name = name 

class X(object): 
    def __init__(self, zs): 
     self.mylist = list(zs) 

    def indexByName(self, name): 
     return indexMatching(self.mylist, lambda x: x.name==name) 

x = X([Z('Fred'), Z('Barney'), Z('Wilma'), Z('Betty')]) 

print x.indexByName('Wilma') 

返回2.

關鍵的想法是使用枚舉在迭代序列時保持索引值。 enumerate(seq)返回一系列(索引,項目)對。然後,當您找到匹配項目時,返回索引。

5

列表,語法爲:

lambda param, list: return_value 

例如,這是加法的lamdba:

lambda x, y: x + y 

我不確定這是如何使您的功能更容易寫不過,因爲這是最明顯的方式:

def myFunction(name): 
    for i, x in enumerate(self.getList()): 
     if x.name == name: 
      return i 

你lamdba會是這樣,但:

lamdba x: x.name == name 

所以這樣做的一個可怕的方式就是:

def myFunction(name): 
    matches = [index 
       for index, value in enumerate(self.getList()) 
       if value.name == name] 
    if matches: 
     return matches[0] 
3

如果你真的想使用lambda提供了一個例子

+1

儘管有複選標記,但並不完全符合OP的要求。問題沒有要求匹配列表中的元素匹配名稱,但元素的名稱屬性(x.name)匹配名稱。你的lambda將是'lambda x:x.name == name'。而他不想要x,他想要列表中的x的索引。 – PaulMcG

1

也許你可以這樣做:

idx = [i for i, a in enumerate(lst) if a.name == name][0]