我对此代码感到困惑,有人可以解释

时间:2019-09-16 09:56:33

标签: 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: ()())()((()()(

2 个答案:

答案 0 :(得分:1)

正如评论中所说,我认为这是不好的编码习惯,应该避免。但这可以作为代码读取的示例。因此,我在这里尝试一下。 (首先,如果您不熟悉read about 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是一个字符串)将生成一个枚举对象,该对象可以进行迭代以获取(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字母的元组和仅由')''('组成的各个索引来产生a generator object然后将由''.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'和{ {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