循环如何在此代码中帮助迭代

时间:2019-05-23 22:19:57

标签: python

当前的问题是,给定一个字符串S,我们可以将每个字母分别转换为小写或大写形式以创建另一个字符串。

所需结果是我们可以创建的所有可能字符串的列表。

例如:

输入:

 S = "a1b2"

输出:

["a1b2", "a1B2", "A1b2", "A1B2"]

我看到下面的代码会生成正确的结果,但是我是Python的初学者,您能否帮助我了解第5和第7行循环的工作原理,即为res赋值。

def letterCasePermutation(self, S):
    res = ['']
    for ch in S:
        if ch.isalpha():
            res = [i+j for i in res for j in [ch.upper(), ch.lower()]]
        else:
            res = [i+ch for i in res]
    return res

2 个答案:

答案 0 :(得分:0)

res结束符是到目前为止所有可能的字符串的列表。对该函数的一次调用将处理下一个字符。

如果字符是非字母(第7行),则理解仅将字符添加到列表中的每个字符串。

如果字符是字母,则新列表在输入中每个包含一个两个字符串:一个添加了大写字母的字符串,一个添加了小写字母的字符串。

>

如果您仍然感到困惑,那么我强烈建议您尝试使用标准调试技术来理解这一点。插入一些有用的打印语句以显示使您感到困惑的值。

def letterCasePermutation(self,S):     res = ['']     对于S中的ch:         print(“ char =”,ch)         如果ch.isalpha():             res = [i + j for i in [ch.upper(),ch.lower()]中j的res         其他:             res = [i + ch for i in res]         打印(res)

return res

letterCasePermutation(无,“ a1b2”)

输出:

char =  a
['A', 'a']
char =  1
['A1', 'a1']
char =  b
['A1B', 'A1b', 'a1B', 'a1b']
char =  2
['A1B2', 'A1b2', 'a1B2', 'a1b2']

答案 1 :(得分:0)

分析此代码的最佳方法是包括以下行:

print(res) 
如第一个答案所示,在外部for循环的末尾

。 然后使用字符串“ 123”和字符串“ abc”运行它,这将隔离两个条件。这给出了以下输出:

['1']
['12']
['123']

['A','a']
['AB','Ab','aB','ab']
['ABC','ABc','AbC','aBC','Abc','aBc','abC','abc']

在这里我们可以看到循环只是将先前生成的列表作为其输入,并且如果下一个字符串char不是字母,则只需通过字符串将数字/符号标记到列表中每个字符串的末尾级联。但是,如果初始输入字符串中的下一个字符是字母,则通过为列表中的每个项目创建两个副本,同时将新字符的较高版本附加到第一个副本中,将列表的长度加倍。将新字符的较低版本复制到第二个副本。 要获得有趣的结果,请查看如果在第2行进行了此更改,代码将如何失败?

res = []