为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

炎炎设计 2022-06-22 19:42:19
我正在尝试通过 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 resresult = 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 resresult = letterCasePermutation("ab")print(result) 上面的块会导致无限循环错误,而不是像代码块 1 那样提供结果。预期结果 = ['AB', 'Ab', 'aB', 'ab']我无法弄清楚我错过了什么。在花了相当多的时间但仍然被卡住之后,我决定发布这个问题。我在这里先向您的帮助表示感谢。
查看完整描述

3 回答

?
阿波罗的战车

TA贡献1862条经验 获得超6个赞

它会导致无限循环,因为您同时在其中进行迭代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 + _res

return res


result = 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 = _res

return res

result = letterCasePermutation("ab")

print(result) 


查看完整回答
反对 回复 2022-06-22
?
慕斯王

TA贡献1864条经验 获得超2个赞

理解不关心分配给理解中使用的相同名称。


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阅读有关切片的更多信息。


查看完整回答
反对 回复 2022-06-22
?
呼啦一阵风

TA贡献1802条经验 获得超6个赞

这是细分:) 谢谢你们帮助我提出这个想法。


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 res



result = letterCasePermutation("ab")

print(result)


查看完整回答
反对 回复 2022-06-22
  • 3 回答
  • 0 关注
  • 150 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信