涉及字符串连接的 Python 列表理解中嵌套的 for 循环细分

我正在尝试通过 Pycharm 调试器调试嵌套的 for 循环......在故障排除过程中,我想将循环分解为两个单独的循环并逐步执行代码,但我很难做到这一点......


这是带有列表理解的代码块:


def letterCasePermutation(S):

    res = ['']

    for ch in S:

        if ch.isalpha():

            res = [i + j for i in res for j in [ch.upper(), ch.lower()]]

    return res


result = letterCasePermutation("ab")

print(result) # expected result = ['AB', 'Ab', 'aB', 'ab']

为了调试此代码块,我想将列表理解分解为以下内容:


def letterCasePermutation(S):

    res = ['']

    for ch in S:

        if ch.isalpha():

            # res = [i + j for i in res for j in [ch.upper(), ch.lower()]]


            for i in res:

                for j in [ch.upper(), ch.lower()]:

                    res.append(i + j)

    return res


result = letterCasePermutation("ab")

print(result) 

上面的块会导致无限循环错误,而不是像代码块 1 那样提供结果。预期结果 = ['AB', 'Ab', 'aB', 'ab']


我无法弄清楚我错过了什么。在花了相当多的时间但仍然被卡住之后,我决定发布这个问题。我在这里先向您的帮助表示感谢。



炎炎设计
浏览 151回答 3
3回答

阿波罗的战车

它会导致无限循环,因为您同时在其中进行迭代res和for i in res追加新值res.append(i + j)。列表理解不是这种情况,因为右侧的表达式=被评估并分配给res.您可以使用第二个列表来避免这样做,def letterCasePermutation(S):res = ['']for ch in S:    if ch.isalpha():        _res = []        for i in res:            for j in [ch.upper(), ch.lower()]:                _res.append(i + j)        res = res + _resreturn resresult = letterCasePermutation("ab")print(result) 编辑:def letterCasePermutation(S):res = ['']for ch in S:    if ch.isalpha():        _res = []        for i in res:            for j in [ch.upper(), ch.lower()]:                _res.append(i + j)        res = _resreturn resresult = letterCasePermutation("ab")print(result) 

慕斯王

理解不关心分配给理解中使用的相同名称。a = [0, 1, 2, 3, 4]a = [i*2 for i in a]print(a)输出[0, 2, 4, 6, 8]。在您的示例中,您res在迭代列表时将元素添加到列表中:for i in a:    a.append(i)这给了你一个无限循环,因为当你继续下一个元素时,更多的元素被添加到列表中。您的选择是分配给一个新的变量名称,或者使用切片来迭代列表的临时副本:a = [0, 1, 2, 3, 4]b = []for i in a:    b.append(i)print(b)输出[0, 1, 2, 3, 4]a = [0, 1, 2, 3, 4]for i in a[:]:    a.append(i)print(a)输出是[0, 1, 2, 3, 4, 0, 1, 2, 3, 4]。a[:]是从第一个元素到最后一个元素的切片,步长为 1。您可以在此处或官方 python 文档中a阅读有关切片的更多信息。

呼啦一阵风

这是细分:) 谢谢你们帮助我提出这个想法。def letterCasePermutation(S):    res = ['']    for ch in S:        _res = []        for i in res:            for j in [ch.upper(), ch.lower()]:                _res.append(i + j)        res = _res    return resresult = letterCasePermutation("ab")print(result)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python