神秘的python行为

时间:2015-02-17 17:50:25

标签: python string sequences

我正在尝试编写一个快速脚本来输出序列。 序列开始如下: 1,11,21,1211,111221,312211 ... 从1开始,然后作为1 1,第二个术语是11,因为两个1s的第三个术语是21的等等。

我在下面写了一个脚本,输出了这个序列中的术语。 当input_string为1时,它输出正确的下一个术语,即11.但是之后的所有术语也输出为11 .....如果我手动将输入设置为11,那么所有术语都会正确计算。

这没有任何意义,因为"1"我的total_sequence[0]变量的初始输入将为"1",正确输出"11"。 然后,下一个术语将以total_sequence[1]作为其输入,即"11",即最后一次迭代输出。 但是这会将"11"作为输出。 如果我直接将"11"作为total_sequence [1]术语而不是引用total_sequence[1](其中= "11"),则会给出正确的输出。

所以基本上为什么input_string = "11"output[1]的{​​{1}}不同?

output = ["1","11"]

2 个答案:

答案 0 :(得分:2)

您在循环体中使用input_string,但永远不会更改,它始终是第一个字符串,在您的示例"1"中。

可能用以下内容更改内循环的第一行:

input_string = total_sequence[i]
for current_char in input_string:

应该足够了,但我没有测试它。

答案 1 :(得分:0)

这被称为“外观和说法”序列;可以使用itertools.groupby

更简单地实现它
from itertools import groupby

def look_and_say(n):
    """
    Generate the first `n` terms of the sequence
      '1', '11', '21', '1211', ...
    """
    if n < 1:
        return

    # first term
    term = "1"
    yield term

    # second through `n`th terms
    for term_num in range(1, n):
        chars = []
        for ch,reps in groupby(term):
            count = len(list(reps))
            chars.append(str(count))
            chars.append(ch)
        term = "".join(chars)
        yield term

然后

N = 5
print(list(look_and_say(N)))

给出

['1', '11', '21', '1211', '111221']

有趣的奖励:证明序列永远不会包含高于3的数字。