2011-11-18 162 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]