【问题标题】:Destructure a for loop解构for循环
【发布时间】:2021-09-03 04:01:19
【问题描述】:

问题集: 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

【问题讨论】:

  • 你想做什么?示例输入和预期输出是什么?

标签: python dictionary code-structure


【解决方案1】:

这种语法称为列表推导。你可以在这里读更多关于它的内容 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

【讨论】:

  • 您好,谢谢您的回答。它工作得很好而且很好,这正是我想要的。
【解决方案2】:

您自己的代码有一些小问题,除了不能正常工作:

  • 第一个参数是self,暗示这将是某个对象的方法,但您将其呈现为函数(实际上它也没有引用self)?
  • letterCombinations 这个名字不是最好的,letter_combinations 在标准 Python 中会更好,但也许这是你的作业要求?
  • 您的函数实际上并没有返回任何内容,因此即使它有效,您也无法判断(注意找到的解决方案确实有 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']

这正是我们所需要的。在循环使用return rst 完成最后一次迭代后,将返回生成的rst

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

【讨论】:

  • 您好,谢谢您的回答。非常感谢详细的解释。我不能同时接受答案,而“除名理解(按说)”正是我想要的。我认为这是应得的。
  • 没关系 - 请记住,对于可读性和速度而言,理解通常是更好的选择,尽管在从其他语言转向 Python 时可能需要一些时间来适应。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-11-04
  • 1970-01-01
相关资源
最近更新 更多