python look-and-say序列改进了

Umu*_*acı 0 python sequences

我想首先介绍一下看起来顺序.它就像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)