Python 将一串数字读作单词,然后将每个单词打印为数字
我想弄清楚如何编写一个代码,将输入从0转换为任何正整数,输入0时返回字符串0,输入1时返回字符串10,输入2时返回字符串1110,输入3时返回字符串3110,依此类推,也就是说,当输入0出现时,输出为0,然后,当输入1时,它查看0的输入并将其读取为“一个零”并打印10,for 2将输入1读取为“一个一个零”并打印1110,依此类推。我知道该怎么做,但它太模糊了,无法翻译成代码。当我发布这篇文章时,我不知道它被调用了什么,但从那以后我发现它是look-and-see序列,我的问题是我不能使用迭代,也不能使用内置的len()或string.append()函数。如果你不能使用任何迭代,那么你需要使用递归,并在0处停止。它看起来像这样:Python 将一串数字读作单词,然后将每个单词打印为数字,python,Python,我想弄清楚如何编写一个代码,将输入从0转换为任何正整数,输入0时返回字符串0,输入1时返回字符串10,输入2时返回字符串1110,输入3时返回字符串3110,依此类推,也就是说,当输入0出现时,输出为0,然后,当输入1时,它查看0的输入并将其读取为“一个零”并打印10,for 2将输入1读取为“一个一个零”并打印1110,依此类推。我知道该怎么做,但它太模糊了,无法翻译成代码。当我发布这篇文章时,我不知道它被调用了什么,但从那以后我发现它是look-and-see序列,我的问题是我不能使用迭代,
def whatever(input):
"""
>>> whatever(0)
'0'
>>> whatever(1)
'10'
>>> whatever(2)
'1110'
>>> whatever(3)
'3110'
>>> whatever(4)
'132110'
>>> whatever(5)
'1113122110'
"""
def looksay(input, result):
if not input:
return result
else:
left, right = input[0], input[1:]
if not result:
result = '1' + left
else:
left_result, count, right_result = result[:-2], int(result[-2]), result[-1]
if left == right_result:
result = left_result + str(count + 1) + right_result
else:
result = result + '1' + left
return looksay(right, result)
def helper(number, result):
if number == 0:
return result
else:
return helper(number - 1, looksay(result, ''))
return helper(input, '0')
if __name__ == '__main__':
import doctest
doctest.testmod()
好吧,我想我知道你打算在这里做什么了。下面是一个可能的解决方案:
import collections
def string(n):
if n == 0:
return '0'
# We're going to count the digits in the previous number
previous = string(n - 1)
# This creates a dictionary with the number of occurences of each digit
current = collections.Counter(previous)
# Now format it as desired:
return ''.join(['{}{}'.format(c, d)
for d, c in sorted(current.items(), reverse=True)])
print(string(4))
# prints 132110
@DSM,正确指出,下面有另一种解释,按顺序读出前面数字的数字。下面是一种方法:
def string(n):
if n == 0:
return '0'
result = []
# We're going to iterate over the previous number's digits.
# The loop will transform '3110' to ['3', '11', '0'].
for digit in string(n - 1):
# If it's the first char, just add it to the list
if not result:
result.append(digit)
# If the current digit is the same as the last one, add it to the
# last element of the list
elif digit == result[-1][0]:
result[-1] += digit
# If it's a different digit, add it to the end of the list.
else:
result.append(digit)
# Now format the resulting list and return it.
return ''.join(['{}{}'.format(len(digits), digits[0])
for digits in result])
print(string(4))
# prints 132110
是的,这就是程序应该如何工作,如果输入4,那么“132110”应该是输出,而不是后者,它将是(0)给出“0”给出“0”给出“10”给出“1110”给出“3110”给出“3110”好的,但是你的4示例没有遵循我给你的模式。按照我的建议,4应该是'100',你可以翻译成'1-1,2-0',然后写'1120'。我强烈建议您使用单元测试编写代码(按照我为您绘制的模式),然后发布代码,以便其他人了解您的意图。这是一个“看”和“说”的序列,我最初的问题是,我不知道它有一个可用于将其分类的名称,另一个问题是我不能使用迭代,len(),或者.append()来编写这段代码。我将其解释为不同的“看一说”顺序,因此f(5)将是“1113122110”,而不是“13123110”——也就是说,您只需从左到右阅读f(4),然后说“一个一[后跟]一个三[后跟]一个二[后跟]两个一[后跟]一个零”。嗯,@DSM,这当然也是一种可能的解释。对于前四个例子,我们的解释似乎是相同的。问题是,这是他给出的唯一例子。如果我们把游戏分发出去:-),我的代码是def(n):如果n==0,则返回“0”。在itertools中,c和ger的连接((str(len(list(ger)))+c)。groupby(f(n-1))。这很好,嗯,我该怎么说呢,简短?;)
groupby
比我的乱七八糟要好得多。这是一个先看后说的序列,但对于这一部分,我不能使用迭代,也不能使用内置的len()函数,这就是我被难倒的原因,我应该把它放到问题中。维基百科上有一篇关于这个序列的文章-。