解构一个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 循环不同。它为 rst
中 j
的每个值、dt[i]
中每个 k
的值创建一个 j+k
列表。
问题集: 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 循环不同。它为 rst
中 j
的每个值、dt[i]
中每个 k
的值创建一个 j+k
列表。