Python列表操作,Lambda表达式

4
def myFunction(name):
    index = 0
    list = self.getList()
    index = (x => x.name == name)
    return index

我想使用lambda表达式在Python列表中查找元素的索引,就像在C#中一样。是否可以像在C#中那样使用lambda表达式来查找特定元素在Python列表中的索引?如果可以,请提供一个示例。

你的 list 是标准的 Python 列表还是对象? - Shamanu4
请问您能否提供更详细的示例,包括样例输入和输出? - Michael Hoffman
3个回答

3
如果您真的想使用lambda,语法如下:

如果你真的想用lambda,语法是:

lambda param, list: return_value

例如,这是一个执行加法的Lambda函数:
lambda x, y: x + y

我不确定这样做能够让你的函数更容易编写,因为这是最显而易见的方法:

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

你的Lambda函数可能是这样的:

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]

1
尽管问题已被确认,但这并不完全符合OP的要求。问题并没有要求匹配列表中元素名称相匹配的匹配,而是要求元素的名称属性(x.name)与名称匹配。您的lambda将是lambda x:x.name == name。而他不想要x,他想要列表中x的索引。 - PaulMcG

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) 返回一系列 (index, item) 对。然后当你找到匹配的项时,返回索引。


0

也许你可以这样做:

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

1
而且如果没有这样的元素?它会抛出索引越界异常。 - Artyom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接