问题集: 电话的字母组合
我想到的解决方案:
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]]
这将循环遍历i
digits
中的每个数字字符。对于每一个,它定义的结果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
列表。