解构一个for循环

Destructure a for loop

问题集: Letter combinations of a phone

我想到的解决方案:

def letterCombinations(self, digits: str) -> List[str]:
    if not digits: return []
    digit_map = {'2': 'abc', '3': 'def', '4': 'ghi', '5': 'jkl', '6': 'mno', 
                 '7': 'pqrs', '8': 'tuv', '9': 'wxyz'}
    result = [""]
    arr = []
    for i in digits:
        for j in digit_map:
            if i==j:
                s = map(str,digit_map[i])
                for x in s:
                    arr.append(x)

在此之后,我打算在 arr 上使用 map() 函数,然后将一个字母表与另一个字母表匹配。然而,这个过程还不够好。 此后我转向解决方案。 我最喜欢的解决方案是 this one 但是,在提供的解决方案中:

def letterCombinations(self, digits: str) -> List[str]:
    if not digits: return []
    dt = {'2': 'abc', '3': 'def', '4': 'ghi', '5': 'jkl', '6': 'mno', '7': 'pqrs', '8': 'tuv', '9': 'wxyz'}
    rst = ['']
    for i in digits: rst = [j+k for j in rst for k in dt[i]]
    return rst

我不明白第 5 行的 for 循环。有人可以解构它并将其写成多行,这样输出就不会改变。

我尝试自己做,但输出发生了变化并给出了错误的结果。

for i in digits:
    tmp = []
    for j in rst:
        for k in dt[i]:
            temp = [j+k] 
    rst += temp

这种语法称为列表理解。你可以在这里读更多关于它的内容 https://docs.python.org/3/tutorial/datastructures.html#list-comprehensions

那部分可以用这些嵌套的 for 循环替换

new_rst = []
for j in rst:
  for k in dt[i]:
    new_rst.append(j+k)

rst = new_rst

你自己的代码有一些小问题,除了不工作:

  • 第一个参数是 self,暗示这将是某个对象的方法,但您将其作为函数呈现(而且它实际上也没有引用 self)?
  • 名称 letterCombinations 不是最好的,letter_combinations 在标准 Python 中会更好,但也许这是您作业的要求?
  • 你的函数实际上没有 return 任何东西,所以即使它起作用了,你也无法分辨(注意找到的解决方案确实有一个 return 语句)

您找到的代码有效的原因:

for i in digits: rst = [j+k for j in rst for k in dt[i]]

这将遍历 digits 中的每个数字字符 i。对于每一个,它将结果 rst 定义为已经在 rst 中的每个字符串 j 与字符串 dt[i] 的每个字符 k 的列表, 是数字对应的字母。

例如,如果将函数调用为 letterCombinations('12'),则会发生这种情况:

  • 第一个字符是 1,因此 i 在第一次迭代期间等于 '1'
  • rst 包含一个空字符串,因此将 dt['1'] 的每个字符添加到该字符串中,并将结果列表 ['a', 'b', 'c'] 分配给 rst
  • 第二个字符是 2,因此 i 在第二次迭代期间等于 '2'
  • dt['2'] 的每个字符现在将添加到 rst 中已有的每个字符串中,因此 rst 将变为 ['ad', 'ae', 'af', 'bd', ... , 'cf']

这正是我们所需要的。结果 rst 在循环完成其最终迭代 return rst 后被 returned。

请注意,[j+k for j in rst for k in dt[i]] 部分是所谓的列表推导式,它与围绕它的普通 for 循环不同。它为 rstj 的每个值、dt[i] 中每个 k 的值创建一个 j+k 列表。