Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/333.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 如何在数组或整数列表中找到重复的整数对模式?_Python_Arrays_List_Pattern Matching - Fatal编程技术网

Python 如何在数组或整数列表中找到重复的整数对模式?

Python 如何在数组或整数列表中找到重复的整数对模式?,python,arrays,list,pattern-matching,Python,Arrays,List,Pattern Matching,我有以下类似的数组或列表: A=[2,-1,2,-1,2,-1,2,-1,2,-1,2,-1,2,-1,1,-1,2,-1,2,-1,2,-1,1,-1,2,-1,2,-1,2,-1] 我需要找到重复的(2,-1)模式序列,如果该模式是连续的,则报告连续序列,直到其中断,即输出B,如下所示 B=[[2, -1, 2, -1, 2, -1, 2, -1, 2, -1, 2, -1, 2, -1],[2, -1, 2, -1, 2, -1], [2, -1, 2, -1, 2, -1]] 第一个

我有以下类似的数组或列表:

A=[2,-1,2,-1,2,-1,2,-1,2,-1,2,-1,2,-1,1,-1,2,-1,2,-1,2,-1,1,-1,2,-1,2,-1,2,-1]
我需要找到重复的(2,-1)模式序列,如果该模式是连续的,则报告连续序列,直到其中断,即输出
B
,如下所示

B=[[2, -1, 2, -1, 2, -1, 2, -1, 2, -1, 2, -1, 2, -1],[2, -1, 2, -1, 2, -1],
[2, -1, 2, -1, 2, -1]]
第一个
(2,-1)
模式序列是
[2,-1,2,-1,2,-1,2,-1,2,-1,2,-1]
,然后断开; 第二个
(2,-1)
模式序列是
[2,-1,2,-1,2,-1]
,然后断开; 最后一个
(2,-1)
模式序列也是
[2,-1,2,-1,2,-1]
,和break

获得此结果的最佳方法是什么


请注意,使用
(2,-1)
就是一个例子-我希望能够对任意一对整数(例如
(3,-1
)或
(3,4)

)执行此操作。如果我没有正确理解您的意思,请更正我。希望下面的代码适合您的需要:

A=[2, -1, 2, -1, 2, -1, 2, -1, 2, -1, 2, -1, 2, -1, 1, -1, 2, -1, 2, -1, 2, -1, 1, -1, 2, -1, 2, -1, 2, -1]
B=[[2, -1, 2, -1, 2, -1, 2, -1, 2, -1, 2, -1, 2, -1],[2, -1, 2, -1, 2, -1],
[2, -1, 2, -1, 2, -1]]

A_str = ''.join(str(x) for x in A)
for item in B:
    if ''.join(str(x) for x in item) in A_str:
        print item

假设您希望B包含a中所有模式的列表,这些模式从整数x开始(默认值为2),从整数y结束(默认值为-1),在值x和y之间交替,那么下面是生成B的方法:

def special_pattern(A, x=2, y=-1):
    B = []
    temp = []
    flag = 0
    for elem in A:
        if elem == x and flag == 0:
            flag = 1
        elif elem == y and flag == 1:
            temp.extend([x, y])
            flag = 0
        else:
            if temp != []:
                B.append(temp)
                temp = []
            if not(elem == x and flag == 1): 
                flag = 0
    if temp != []:
        B.append(temp)
    return B

我提出了这个解决方案:

def find_patterns (lst, pattern):
    pattern = list(pattern)
    patternLength = len(pattern)
    lengths = []
    i, currentLength = 0, 0
    while i <= len(lst) - patternLength:
        if lst[i:i + patternLength] == pattern:
            currentLength += 1
            i += patternLength
        else:
            i += 1
            if currentLength > 0:
                lengths.append(currentLength)
                currentLength = 0
    if currentLength > 0:
        lengths.append(currentLength)
    return [pattern * x for x in lengths]

如果你喜欢疯狂的一行程序,你也可以使用正则表达式来研究这个解决方案。我不推荐它,因为它不仅可读性差,而且效率也不高。它还支持任意长度的模式,但它还要求列表是整数列表,而上面的解决方案可以处理任何类型的列表。所以这真的只是为了好奇的人:

def find_patterns (lst, pattern):
    return [[int(x) for x in m.split(';')] for m in re.findall('({0}(?:;{0})*)'.format(';'.join(map(str, pattern))), ';'.join(map(str, lst)))]

你的尝试在哪里?@astrosyam我尝试了一个很长的解决方案,代码大约是70行。你需要更清楚地解释你的特殊模式。你只是在寻找重复序列的
2,-1
?@VigneshKalai不固定,还有其他类似的模式,如3,-1,3,-1等等。你需要定义你是什么样的模式用精确的术语寻找。否则我们帮不了你。非常好的代码,非常感谢你的分享和帮助!我的解决方案非常冗长和难看。你只使用了19行代码,我的代码多达70行。当然,这个答案的问题是你必须有输出(
B
)在程序运行之前就已经有了!谢谢大家的分享,这段代码是一个比较通用的解决方案,非常完美!
def find_patterns (lst, pattern):
    return [[int(x) for x in m.split(';')] for m in re.findall('({0}(?:;{0})*)'.format(';'.join(map(str, pattern))), ';'.join(map(str, lst)))]