解构 for 循环



问题集: 电话的字母组合

我想到的解决方案:

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()函数,然后将一个字母表与另一个字母表匹配。然而,这个过程还不够好。 此后,我转向解决方案。 我最喜欢的解决方案是 这个 但是,在提供的解决方案中:

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语句的)

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

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

这将循环遍历idigits中的每个数字字符。对于每一个,它定义的结果rst是每个字符串的列表,j已经在rst,结合字符串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完成其最终迭代后返回。

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

相关内容

  • 没有找到相关文章

最新更新