首页 > 解决方案 > 我对这段代码感到困惑,有人可以解释一下吗

问题描述

将字符串中的重复字符更改为)和不重复的字符(

我尝试了 2 个 for 循环,但它不起作用。我是编码初学者,因此我无法理解这个复杂的代码,有人可以解释一下。

def duplicate_encode(word):
    return (lambda w: ''.join(('(', ')')[c in w[:i] + w[i+1:]] for i, c in enumerate(w)))(word.lower())

print(duplicate_encode("rEcede"))

Input: "Mercedes Bench"
Output: ()())()((()()(

标签: python-3.x

解决方案


正如评论中所说,我认为这是不好的编码习惯,应该避免。但它可以作为代码阅读的一个例子。所以我会在这里尝试一下。(首先,如果您不熟悉lambda,您应该阅读它。)

首先,查看匹配的括号并尝试找到“最深”的部分:

  1. 最上面的一个是:lambda w: ''.join(('(', ')')[c in w[:i] + w[i+1:]] for i, c in enumerate(w)))应用于word.lower().

  2. 然后我们('(', ')')[c in w[:i] + w[i+1:]] for i, c in enumerate(w))在里面放了三个点''.join(...)

  3. enumerate(w),其中 w 是一个字符串,将生成一个枚举对象,可以迭代该对象以获取 form 的元组(i,c),其中i是字母的索引c。尝试运行for x in enumerate(w): print(x)不同的字符串w以感受它。

  4. 然后,('(', ')')[c in w[:i] + w[i+1:]] for i, c in enumerate(w))将通过迭代 w 的字母元组和相应的索引来生成一个生成器对象,这些索引将由 only 组成,')'然后'('将 by 连接''.join(...)到最终输出字符串中。让我们进一步分解。

  5. [c in w[:i] + w[i+1:]]将始终评估为 [True] 或[False](有关原因,请参见 6)。现在,('(', ')')[False]将返回'('并将('(', ')')[True]返回')'(我现在通过输入它来了解会发生什么)。

  6. 对于其中的任何字母,w生成器对象中都会有一个元组(参见第 4 点)(i, c),. 将[c in w[:i] + w[i+1:]]首先采用 的两个子字符串w。第一个将包括该位置之前的所有字母i(当前字母所在的位置),第二个将包括当前字母之后的所有字母。然后将这两个子字符串连接起来。然后c in部分将只检查当前字母是否在结果字符串中,有效地检查该字母是否c也出现在字符串的其他部分。例如,对于w = 'aba'来自 的一个和第二个元组,enumerate('aba')即将等于哪个是并且 将等于(1, 'b')w[:i]'aba'[:1]'a'w[i+1:]'aba'[:1]等于'a',连​​接起来我们得到一个字符串'aa',因此[c in w[:i] + w[i+1:]]在这种情况下等于['b' in 'aa']将评估为[False],因此导致'('

实际上,lambda 部分只是一个函数,对于给定位置的每个字母,检查相同的字母是否存在于修改后的字符串中,并且该字母已从该位置删除。然后将其应用于word.lower()确保忽略大写字母的参数(例如,'A' 和 'a' 被视为同一个字母)。


推荐阅读