运行长度(python)

时间:2018-01-24 20:50:29

标签: python matplotlib

我应该创建一个列表,如果头或尾是连续的,它会考虑到它...即。 [H,H,H,T,T,H,H,T,T,H,T] = [3,2,2,2,1,1] 为什么这不起作用?

from __future__ import print_function
import numpy as np
import matplotlib.pyplot as plt
def run_lengths(n,p):
    tosses= np.random.choice(([True, False ]),p=[p,1-p], size=n)
    heads= True
    tails= False
    heads_counter = 0
    tails_counter=0
    runlist=[]
    rl=runlist
    for i in tosses:
        if True:
            heads_counter+=1
            if tosses[i+1]== False:
                rl.append(heads_counter)
                heads_counter=0
        elif False:
            tails_counter +=1
            if tosses[i+1]== True:
                rl.append(tails_counter)
                tails_counter=0
    print(runlist)
    print(tosses)
##print(run_lengths(10,.5))

1 个答案:

答案 0 :(得分:1)

您不需要单独的头部和尾部计数器。只需使用变量来保存列表的前一个元素,并将当前元素与它进行比较。如果相同,则递增计数器。如果不同,请将计数器附加到结果列表并重置计数器。在循环之后,追加最终的计数器。

另外,if True: ... elif False:是胡说八道。始终会使用True分支。我想你的意思是if i == True:。或者if i == heads:(您实际上从未使用headstails变量)。

import numpy as np
def run_lengths(n,p):
    tosses= np.random.choice(([True, False ]),p=[p,1-p], size=n)
    last_toss = tosses[0]
    counter = 1
    runlist = []
    for toss in tosses[1:]:
        if toss == last_toss:
           counter += 1
        else:
           runlist.append(counter)
           counter = 1
           last_toss = toss
    runlist.append(counter)     
    print(runlist)
    print(tosses)

run_lengths(15, .5)

DEMO