python-3.x - 我对这段代码感到困惑,有人可以解释一下吗
问题描述
将字符串中的重复字符更改为)
和不重复的字符(
。
我尝试了 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: ()())()((()()(
解决方案
正如评论中所说,我认为这是不好的编码习惯,应该避免。但它可以作为代码阅读的一个例子。所以我会在这里尝试一下。(首先,如果您不熟悉lambda,您应该阅读它。)
首先,查看匹配的括号并尝试找到“最深”的部分:
最上面的一个是:
lambda w: ''.join(('(', ')')[c in w[:i] + w[i+1:]] for i, c in enumerate(w)))
应用于word.lower()
.然后我们
('(', ')')[c in w[:i] + w[i+1:]] for i, c in enumerate(w))
在里面放了三个点''.join(...)
。enumerate(w)
,其中 w 是一个字符串,将生成一个枚举对象,可以迭代该对象以获取 form 的元组(i,c)
,其中i
是字母的索引c
。尝试运行for x in enumerate(w): print(x)
不同的字符串w
以感受它。然后,
('(', ')')[c in w[:i] + w[i+1:]] for i, c in enumerate(w))
将通过迭代 w 的字母元组和相应的索引来生成一个生成器对象,这些索引将由 only 组成,')'
然后'('
将 by 连接''.join(...)
到最终输出字符串中。让我们进一步分解。[c in w[:i] + w[i+1:]]
将始终评估为 [True] 或[False]
(有关原因,请参见 6)。现在,('(', ')')[False]
将返回'('
并将('(', ')')[True]
返回')'
(我现在通过输入它来了解会发生什么)。对于其中的任何字母,
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' 被视为同一个字母)。
推荐阅读
- java - java - 如何从控制台获取下一行的输入?我已经编写了一个代码,但它没有提供所需的输出
- c# - .Net Core Async Await - 未按预期运行
- python-3.x - Pandas 数据透视表中的计算字段
- android - Unity启动画面android build 2018.2.5f1后灰屏10秒
- mirth-connect - 无法在 Windows 服务器公共 IP 上启动 mirth connect
- sql-server - 在 XPath 到 SQL Server XML 列中从 sum 中消除 xml 节点
- r - 如何在 R 中执行断线回归分析?
- javafx - 从另一个线程写入应用程序 jfx 画布
- c# - Visual Studio 中的 SQL Server 2012 Express 先决条件错误
- java - 由于 java.lang.NoClassDefFoundError 无法运行代码:com/fasterxml/jackson/annotation/JsonMerge