将字符串中的重复字符更改为)
,将不重复字符更改为(
。
我已经尝试了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: ()())()((()()(
答案 0 :(得分:1)
正如评论中所说,我认为这是不好的编码习惯,应该避免。但这可以作为代码读取的示例。因此,我在这里尝试一下。 (首先,如果您不熟悉read about 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是一个字符串)将生成一个枚举对象,该对象可以进行迭代以获取(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字母的元组和仅由')'
和'('
组成的各个索引来产生a generator object然后将由''.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'
和{ {1}}等于等于{a的w[i+1:]
,串联得到一个字符串'aba'[:1]
,因此得到一个'aa'
,在这种情况下等于[c in w[:i] + w[i+1:]]
将计算为['b' in 'aa']
,因此得出[False]
。
有效地,lambda部分只是一个函数,对于给定位置上的每个字母,它检查在从该位置删除了字母的修改字符串中是否存在相同的字母。然后将其应用于参数'('
,该参数仅确保忽略大写字母(例如 ,'A'和'a'被视为同一字母)。
答案 1 :(得分:0)
此代码完全复制了lambda函数的功能。通过将逻辑分成不同的语句,可以更容易地遵循逻辑。从打印语句中删除注释,以查看整个过程的详细信息。
def simple_duplicate_encode(word):
output = ""
for i, c in enumerate(word):
# print(i,c)
i1 = word[:i]
i2 = word[i+1:]
# print(":{} = {}".format(i, word[:i]))
# print("{}: = {}".format(i+1, word[i+1:]))
is_duplicated = c in i1 + i2 # Check to see if the character c is in the rest of the string
# print("Is duplicated:{}".format(is_duplicated))
character = ('(',')')[is_duplicated] # If is_duplicated = True the value is 1, else 0
# print(character)
output += character
return output