我有一个看起来像
的数组A=[0,0,1,1,2,5,6,3,7,7,0,0,1,1,2,5,6,3,7,7]
自" 0,0,1,1,2,5,6,3,7,7"部分reapeats本身我不需要第二部分所以对于给定的数组它应该给我
A=[0,0,1,1,2,5,6,3,7,7]
我无法使用set()函数,我不知道在这种情况下我还能使用什么。是否有可以执行此操作的函数?
答案 0 :(得分:0)
我定义了以下两种方法:
def check_repeat(l):
for i in range(1,len(l)//2+1):
pattern=l[:i]
sub_lists=create_sublists(l, i, True)
if all([x==pattern for x in sub_lists]):
print("Found pattern {} with length {}".format(pattern, i))
return pattern
def create_sublists(l, n, only_full=False):
sub_lists=[]
for j in range(n, len(l),n):
if only_full and len(l[j:j+n])<n:
continue
sub_lists.append(l[j:j+n])
return sub_lists
它的工作原理如下:使用check_repeat(your_list)
检查输入列表的任意长度模式。如果i
的第一个i
条目等于所有后续长度为your_list
的子列表,则会找到长度为i
的模式。子列表由方法create_sublists
创建,该方法返回列表列表。如果only_full
设置为True
,则只允许长度为n
的子列表。这会处理您的列表查找的示例,例如此A=[1,2,3,1,2,3,1,2]
,并且您希望接受[1,2,3]
作为有效模式,并忽略剩余的子列表[1,2]
。
然后将每个子列表与当前pattern
进行比较,即输入列表的第一个i
条目。如果所有子列表与当前模式相等,则会找到真实模式。
与Python finding repeating sequence in list of integers?中的解决方案相比,我不仅检查下一个i
条目是否与当前模式匹配,还检查以下所有长度为i
的子列表。