关于python:lambda函数,用于替换字符串中的字符

Lambda function for replacing characters in the string

下面是用于替换字符的python代码。有人能解释一下lambda部分吗?最初,x取"p",检查a1或a2。交换发生在哪里?

1
2
3
4
5
6
7
8
def replaceUsingMapAndLambda(sent, a1, a2):
    # We create a lambda that only works if we input a1 or a2 and swaps them.
    newSent = map(lambda x: x if(x != a1 and x != a2) else a1 if x == a2 else a2, sent)
    print(newSent)
    return ''.join(newSent)


print(replaceUsingMapAndLambda("puporials toinp","p","t"))

输出:

1
2
3
$python main.py
['t', 'u', 't', 'o', 'r', 'i', 'a', 'l', 's', ' ', 'p', 'o', 'i', 'n', 't']
tutorials point

谢谢,雷塞卡


为了避免混淆,让我们先提取lambda函数,看看它做了什么。lambda函数定义为

1
lambda x: x if(x != a1 and x != a2) else a1 if x == a2 else a2

lambda语句避免了创建命名函数的定义,但是任何lambda函数仍然可以定义为普通函数。此特定lambda函数使用三元运算符。这可以扩展为常规if-else语句。这将导致类似这样的等价正则函数

1
2
3
4
5
6
7
def func(x, a1, a2):
    if x != a1 and x != a2:
        return x
    elif x == a2:
        return a1
    else:
        return a2


这与以下内容相同:

1
2
3
4
5
6
7
8
9
10
11
12
13
def replaceUsingMapAndLambda(sent, a1, a2):
    # We create a lambda that only works if we input a1 or a2 and swaps them.
    newSent = []
    for x in sent:
        if x != a1 and x != a2:
            newSent.append(x)
        elif x == a2:
            newSent.append(a1)
        else:
            newSent.append(a2)

    print(newSent)
    return ''.join(newSent)

lambda是创建匿名函数的关键字,map将此匿名函数应用于列表的每个元素并返回结果。


它采用字符串(或列表),在本例中是:"puporials toinp"

然后它迭代字符串/列表中的每个字符/项,并检查以下内容:(我将为您中断lambda代码)

1
lambda x: x if(x != a1 and x != a2) else a1 if x == a2 else a2

1)如果char/item不等于a1且不等于a2,则将其映射到选中的相同字符。

这是什么代码:x if(x != a1 and x != a2)

否则

2)如果字符等于a2,则映射a1的值;如果不等于a2,则映射a2。

这是什么代码:else a1 if x == a2 else a2

然后newsent是一个map对象,其中包含chars(上面解释的逻辑),并使用''.join(newSent)命令将其转换回字符串。