提问人: 提问时间:1/10/2023 更新时间:1/11/2023 访问量:50
为什么在字符串长度等于 key 后,我的字符串没有被修改为 Python 字典中存在的值之一?
Why does my string doesn't get modified to one of the values present in the dictionary in Python after length of string becomes equal to key?
问:
我有一个数字“n”(例如n=60),我的任务是将数字转换为字符串 empty = 'sixzero' 并计算字符串的长度并按以下方式进一步修改它,“sixzero”的长度为 7,因此字符串的进一步修改是“七”,七的长度为 5,因此进一步将其修改为“五”,然后长度为 4,因此它将被修改为“四”并在这一点应该停止,因为字符串的长度将是 4,字符串的值也是“四”。我需要返回 'four' ,所以最初我实现了 empty = 'sixzero',但我无法达到最终结果 'four'。下面是我的代码。
class Solution(object):
# (60)
def numbers_of_letters(self,n):
arr = {0:'zero',1:'one',2:'two',3:'three',4:'four',5:'five',
6:'six',7:'seven',8:'eight',9:'nine'}
empty = ''
modi =''
to_char_array = list(map(int, str(n)))
for i in range(len(to_char_array)):
if to_char_array[i] in arr.keys():
empty += str(arr.get(to_char_array[i]))
else:
pass
k=0
while len(empty) not in arr.values():
if len(empty) in arr.keys():
modi += str(arr.get(k))
else:
pass
return modi
if __name__ == "__main__":
n=60
print(Solution().numbers_of_letters(n))
答:
0赞
Codist
1/11/2023
#1
一个微不足道的递归方法将为您提供所需的答案。请注意,无论传递给此函数的值是什么,结果都将始终为“四”
MAP = [
'zero',
'one',
'two',
'three',
'four',
'five',
'six',
'seven',
'eight',
'nine'
]
def as_string(n):
if n == 0:
return MAP[0]
s = []
while n > 0:
s.append(MAP[n%10])
n //= 10
return ''.join(s)
def number_of_letters(n):
s = as_string(n)
if (ls := len(s)) == n:
return s
return number_of_letters(ls)
print(number_of_letters(60))
输出:
four
注意:
as_string() 函数将有效地反向返回字符串。例如,对于值 60,它将返回“zerosix”。但是,这并不重要,因为我们只关心返回值的长度。
as_string() 函数中的整数算术比任何涉及与 str <-> int 之间转换的解决方案都要好得多
另类:
使用相同的 MAP 列表:
def as_string(n):
def _next(n):
if n == 0:
yield 0
while n > 0:
yield n % 10
n //= 10
return ''.join(reversed([MAP[i] for i in _next(n)]))
def number_of_letters(n, rv=None):
if rv is None:
rv = list()
rv.append(s := as_string(n))
if (ls := len(s)) == n:
return rv
return number_of_letters(ls, rv)
print(number_of_letters(60))
输出:
['sixzero', 'seven', 'five', 'four']
评论
0赞
1/11/2023
如果我必须返回数组作为输入怎么办?例如,对于输入 n=12 ,我想返回 arr = [“onetwo”, “six”, “three”, “five”, “four”]
1赞
Codist
1/11/2023
@Aurora19 为此,您必须修改代码
0赞
1/11/2023
啊,是的......找到了做到这一点的方法,我创建了一个空数组 res,并在 while res[-1]!='four: res.append(modified) 中
0赞
matszwecja
1/11/2023
#2
方法略有不同,每个步骤使用两个帮助程序函数:
class Solution(object):
def numbers_of_letters(self,n):
while True:
new_n = words_to_number(number_to_words(n))
if new_n == n:
break
else:
n = new_n
return number_to_words(new_n)
def words_to_number(words):
print("".join(words))
return sum(map(len, words))
def number_to_words(n):
print(n)
arr = {0:'zero',1:'one',2:'two',3:'three',4:'four',5:'five',
6:'six',7:'seven',8:'eight',9:'nine'}
to_char_array = list(map(int, str(n)))
words = list(map(lambda x: arr[x], to_char_array))
return words
if __name__ == "__main__":
n=60
print(Solution().numbers_of_letters(n))
评论
0赞
1/11/2023
如果我必须返回数组作为输入怎么办?例如,对于输入 n=12 ,我想返回 arr = [“onetwo”, “six”, “three”, “five”, “four”]
1赞
matszwecja
1/11/2023
您可以将返回值 number_to_words 分配给变量,将其追加到某个列表,然后继续words_to_number。
0赞
1/11/2023
像这样的东西 而 result[-1]!='four' , result.append(modified) ?
0赞
quamrana
1/11/2023
#3
因此,OP 风格的答案只是在结束条件不成立时循环:
class Solution:
def numbers_of_letters(self, n):
arr = ['zero','one','two','three','four','five','six','seven','eight','nine']
while True:
number_as_str = str(n)
text = ''
for digit in number_as_str:
text += arr[int(digit)]
if len(text) == n:
return text
n = len(text)
if __name__ == "__main__":
n=463829
print(Solution().numbers_of_letters(n))
输出:
four
正如@Fred所指出的,琐碎的版本是:
class Solution:
def numbers_of_letters(self, n):
return 'four'
评论
0赞
1/11/2023
我们可以将每个修改存储在列表中并将其显示为输出吗?
1赞
quamrana
1/11/2023
是的,但你似乎在问一个新问题。你应该这样做。
评论
10
"ten"
return 'four'