修改代码以按顺序返回数字的真或假

时间:2014-09-11 16:10:26

标签: python list python-2.7 numpy sequence

    import numpy as np                                          
    import re                                                   

    def validate(seq):                                          
        stl = "".join(np.diff(seq).astype(str))                 
        for x in re.findall("[1]+",stl):                        
            if len(x)>3:                                        
                return False                                    
        return True                                             

    print validate([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 16, 20])
    print validate([1, 2, 3, 6, 7, 8, 9, 11, 12, 16, 17, 18, 19, 22, 23])
    print validate([2, 3, 5, 7, 9, 10, 11, 12, 14, 15, 17, 20, 22, 23, 24])

输出

    False
    True
    True

此代码检查列表并检查链接的数量,如果第一次打印(1,2,3,4,5,6,7,...)的数量超过4,则返回False,返回如果第二次打印(6,7,8,9)(16,17,18,19)中只有4个顺序,则为真。

那么当列表中只有一个包含4个数字的组时,如何修改代码以返回True?对于序列中包含多于数字的列表,返回False?

print validate([1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 15, 16, 20])
print validate([1, 2, 3, 6, 7, 8, 9, 11, 12, 16, 17, 18, 19, 22, 23])
print validate([2, 3, 5, 7, 9, 10, 11, 12, 14, 15, 17, 20, 22, 23, 24])

输出

False
False
True

1 个答案:

答案 0 :(得分:0)

您定义验证功能的方式有点难以理解。我用以下方式重写了它

def validate(seq, counts=1, N=4):
    if len(seq) < N:
        return False

    diff_seq = np.diff(seq)
    sum_seq = np.array([(np.sum(diff_seq[i:i+N-1])==N-1) for i in range(len(diff_seq)-N+2)])
    return np.count_nonzero(sum_seq) == counts

其中N是组中连续数字的长度,counts是您希望在seq中拥有的此类组的数量。

修改 您可以使用convolve在函数validate中计算sum_seq,如下所示

    sum_seq = np.convolve(diff_seq, np.ones((N-1,)), mode='valid') == N-1

这应该快得多,看起来更加pythonic。