【问题标题】:Mysterious python behaviour神秘的蟒蛇行为
【发布时间】:2015-02-17 17:50:25
【问题描述】:

我正在尝试编写一个快速脚本来输出序列。 序列开始如下: 1,11,21,1211,111221,312211... 从 1 开始,然后作为 1 1 第二项是 11,因为两个 1 第三项是 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](which = "11"),那么就会给出正确的输出。

那么基本上为什么input_string = "11"output[1] 不同,而output = ["1","11"]

input_string= "1"
N=5
total_sequence = [input_string]

for i in xrange(0,N,1):    
    N_counter = int(0)
    previous_char = ""
    output_string = ""
    character_index = int(1)

    #loop through each character in the current sequence term
    for current_char in total_sequence[i]:
        #if first character
        if  character_index == 1:
            N_counter = 1
        #if last character
        if character_index == len(input_string):
            if current_char == previous_char:
                N_counter = N_counter + 1

            if current_char != previous_char:
                if previous_char!="":
                    output_string  = output_string + str( N_counter ) + str( previous_char )
                N_counter = int( 1 )    
            output_string  = output_string + str( N_counter ) + str( current_char )

        #if neither first nor last character
        if character_index != 1 and character_index != len(input_string) :
            if current_char == previous_char:
                N_counter = N_counter + 1

            if current_char != previous_char:
                output_string  = output_string + str( N_counter ) + str( previous_char )
                N_counter = int( 1 )

        character_index = character_index + 1
        previous_char = current_char

    total_sequence.append( output_string)  

print total_sequence

【问题讨论】:

  • 这似乎是来自 Python Challenge 的问题。
  • 嗯,很可能。在您发表评论之前,我从未听说过 python 挑战。我从一本朋友的谜题书中获得了这个序列,其中的谜题是估计这个序列的第 n 项中的字符数。
  • 这是一个经典的拼图系列,您可以在 Python Challenge 中找到它,也可以在大量有关拼图的书籍中找到它。

标签: python string sequences


【解决方案1】:

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

可能将内部循环的第一行更改为:

input_string = total_sequence[i]
for current_char in input_string:

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

【讨论】:

  • 好吧,我现在确实觉得自己像个白痴。感谢罗德里戈的敏锐眼光。
【解决方案2】:

这被称为“看和说”序列;使用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 的数字。

【讨论】: