python look and say序列改进

2024-05-19 02:10:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我想先介绍一下看和说的顺序。就像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

我已经试着让它工作了好几个小时了,逻辑出了问题,我现在有一个大脑冻结。

这是一个实际上不起作用的脚本(返回错误的结果),但它至少可以给你一个想法。

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

Tags: 字符串脚本so顺序规则系统语义序列
3条回答

我发现你的代码有两个问题:

  • 虽然计数器k不计算字符a[i],但resultka[i]扩展。将a[i]替换为last(您可能不想在第一轮中添加任何内容)。

  • 循环之后,您必须再次将计数器的最后一个值与最后一个字符相加(这尚未完成),即在循环之后再添加一个result = result+str(k)+last

总的来说

def seq(a):
    a = str(a)
    k,last,result = 1,a[0],''
    for i in range(1,len(a)):
        if last==a[i]:k+=1
        else:
            result = result+str(k)+last
            k=1
        last = a[i]
    result = result+str(k)+last
    return result

我想你为什么会被难住的部分原因是你使用了无意义的变量名。您很好地描述了这个问题并用名称来调用它,但是您的函数甚至没有使用这个名称。

如果你认为你以“看”开头的字符串,而以“说”结尾的字符串,那就是一个开始。result可能很好,但是ak让你困惑。last我认为是误导性的,因为它可以表示前一个或最后一个。

另外,Python的for实际上是foreach,这是有原因的——在“look”中每个字符一个接一个,所以在循环中显式地执行它。

def looksay(look):
    look = str(look)
    prev, count, say = look[0], 1, ''
    for char in look[1:]:
        if char == prev:
            count += 1
            continue
        say += str(count) + prev
        prev = char
        count = 1
    return say + str(count) + prev

间距不那么重要,但Python确实有一个standard coding style,而且它确实有助于使用它的可读性。你花在分析代码上的时间越少,你对问题的关注就越多。

你可以使用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'

groupby从iterable对象返回连续的键和组。键是为每个元素计算的函数,如果未指定,则为标识函数(如上所述)。这个组是一个迭代器-当键函数的值改变时会生成一个新的组。例如,根据文献记载:

# [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

相关问题 更多 >

    热门问题