我很困惑。我正在尝试制作一个遵循以下模式的程序:
Index: Value:
0 0
1 10
2 1110
3 3110
4 132110
5 1113122110
6 311311222110
...
此模式采用函数的前一个值并表示数字的数量 如果索引 1 是 10,则 2 会说一一一零或 1110。
我创建了一个函数,它接受字符串的第一个字符并返回该字符在字符串其余部分出现的次数。我需要提示输入索引,然后它会打印出来:
index : digits : english words
3 : 3110 : three ones. one zero
这是我目前的代码,但我不知道如何求解实际值:
def strHead(s):
"""strHead: String -> String"""
return s[0]
def strTail(s, run):
"""strTail: String -> String"""
return s[1:]
def runLenAux(s, c):
""" s = string and c = head of string
"""
if s == "":
return 0
else:
if strHead(s)== c:
return 1 + int(runLenAux(strTail(s), c))
else:
return 0
编辑: 不幸的是,我不能使用任何内置函数,如 .append 或 len() 我什至不能使用列表。 :( 如果给定索引,是否有办法将我的函数 runLenAux(s, c) 合并到查找值中?
请您参考如下方法:
这主要是以 itertools.groupby 的形式为您编写的,它接受一个可迭代对象(在您的例子中是字符串)并对唯一元素进行分组。它提供成对的生成器(如果您不熟悉它们,可以将其视为可以循环遍历的列表),其中每对是原始可迭代对象的值,然后是所有这些值。
所以,例如:
>>> s = str(1113122110)
>>> groupby(s)
<itertools.groupby at 0x1044be5d0>
让我们列出它们以查看所有内容:
>>> [(n, list(c)) for n, c in groupby(s)]
[('1', ['1', '1', '1']),
('3', ['3']),
('1', ['1']),
('2', ['2', '2']),
('1', ['1', '1']),
('0', ['0'])]
要将其转换为您想要的格式,您确实需要每个辅助列表的长度:
>>> [(len(list(c)), n) for n, c in groupby(s)]
[(3, '1'), (1, '3'), (1, '1'), (2, '2'), (2, '1'), (1, '0')]
让我们制作长度字符串:
>>> [(str(len(list(c))), n) for n, c in groupby(s)]
[('3', '1'), ('1', '3'), ('1', '1'), ('2', '2'), ('2', '1'), ('1', '0')]
要获得下一个数字,您需要加入所有这些。为此,“链接”它们:
>>> from itertools import chain
>>> ''.join(chain(*[(str(len(list(c))), n) for n, c in groupby(s)]))
'311311222110'
当然,如果您不想只打印它,您可能需要在最后一个整数:
>>> int(''.join(chain(*[(str(len(list(c))), n) for n, c in groupby(s)])))
311311222110
要获取英文描述符,我会使用字典来获取英文单词:
nwords = {'0': zero, '1': 'one', '2': 'two', '3': 'three'} # etc.
for c, n in [(str(len(list(c))), n) for n, c in groupby(s)]:
print "{c} {n}{p}".format(p='' if c=='1' else 's', c=nwords[c], n=nwords[n])
打印:
three ones
one three
one one
two twos
two ones
one zero
我会留给您将这些部分放在一起以获得采用索引并递归计算以前的答案以给出最终答案的东西。
