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)))]