我想首先介绍一下看起来顺序.它就像a = {1, 11, 21, 1211, 111221 ...
系统检查前一个数字并计算数字.
1 = one 1 (so = 11)
11 = two 1 (so = 21)
21 = one 2 one 1 (so = 1211)
作为序列的规则,没有数字可以超过3,所以创建一个转换表可以适应.但它不是语义,我不喜欢它.
我想要的是一个脚本,它评估给定的值并返回一个看似相似的字符串.
但是,为了超越限制,我希望它甚至可以评估字符,因此它可以返回1A2b41.
我一直试图让它工作几个小时,逻辑变得糟糕,我现在正处于脑力激荡状态.
这是实际上不起作用的脚本(返回false结果),但它至少可以给你这个想法.
def seq(a):
k,last,result,a = 1,'','',str(a)
for i in range(len(a)):
if last==a[i]:k+=1
else:
result = result+str(k)+a[i]
k=1
last = a[i]
return result
Run Code Online (Sandbox Code Playgroud)
Mic*_*kis 14
你可以使用groupby它,它就是你想要的:
from itertools import groupby
def lookandsay(n):
return ''.join( str(len(list(g))) + k for k, g in groupby(n))
>>> lookandsay('1')
'11'
>>> lookandsay('1A2b41')
'111A121b1411'
>>> lookandsay(lookandsay('1A2b41'))
'311A1112111b111421'
Run Code Online (Sandbox Code Playgroud)
groupby从可迭代对象返回连续的键和组.键是为每个元素计算的函数,或者如果未指定则为标识函数(如上所述).该组是一个迭代器 - 当键函数的值发生变化时,会生成一个新组.因此,例如,根据文档:
# [k for k, g in groupby('AAAABBBCCDAABBB')] --> A B C D A B
# [list(g) for k, g in groupby('AAAABBBCCD')] --> AAAA BBB CC D
Run Code Online (Sandbox Code Playgroud)