我有一个列表的列表,并且每个列表中有重复序列。 我试图计算列表整数的重复序列的长度:
list_a = [111,0,3,1,111,0,3,1,111,0,3,1]
list_b = [67,4,67,4,67,4,67,4,2,9,0]
list_c = [1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,23,18,10]
这将返回:
list_a count = 4 (for [111,0,3,1])
list_b count = 2 (for [67,4])
list_c count = 10 (for [1,2,3,4,5,6,7,8,9,0])
任何意见或建议将受到欢迎。 我试图用re.compile去解决它,但现在,它并不完全正确。
Answer 1:
通过猜测2和一半的序列长度之间迭代猜测序列长度。 如果没有模式被发现,在默认情况下返回1。
def guess_seq_len(seq):
guess = 1
max_len = len(seq) / 2
for x in range(2, max_len):
if seq[0:x] == seq[x:2*x] :
return x
return guess
list_a = [111,0,3,1,111,0,3,1,111,0,3,1]
list_b = [67,4,67,4,67,4,67,4,2,9,0]
list_c = [1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7,8,9,0,23,18,10]
print guess_seq_len(list_a)
print guess_seq_len(list_b)
print guess_seq_len(list_c)
print guess_seq_len(range(500)) # test of no repetition
这使(预期):
4
2
10
1
按照要求,这种替代给出最长的重复序列。 因此,它会返回4 list_b。 唯一的变化是guess = x
,而不是return x
def guess_seq_len(seq):
guess = 1
max_len = len(seq) / 2
for x in range(2, max_len):
if seq[0:x] == seq[x:2*x] :
guess = x
return guess
Answer 2:
这为我工作。
def repeated(L):
'''Reduce the input list to a list of all repeated integers in the list.'''
return [item for item in list(set(L)) if L.count(item) > 1]
def print_result(L, name):
'''Print the output for one list.'''
output = repeated(L)
print '%s count = %i (for %s)' % (name, len(output), output)
list_a = [111, 0, 3, 1, 111, 0, 3, 1, 111, 0, 3, 1]
list_b = [67, 4, 67, 4, 67, 4, 67, 4, 2, 9, 0]
list_c = [
1, 2, 3, 4, 5, 6, 7, 8, 9, 0, 1, 2,
3, 4, 5, 6, 7, 8, 9, 0, 23, 18, 10
]
print_result(list_a, 'list_a')
print_result(list_b, 'list_b')
print_result(list_c, 'list_c')
Python的set()
函数将改变列表的一组,一个数据类型,它只能包含任何给定值之一,很像代数一组。 我转换的输入列表的一组,然后再返回到一个列表,该列表缩减到只有其独特的价值。 然后,我测试了原来的列表,每个值的,看它是否包含不止一次该值。 我返回的所有副本的列表。 代码的其余部分只是为了演示目的,以表明它的工作原理。
编辑:语法高亮不喜欢在我的文档字符串中的撇号。
文章来源: Python finding repeating sequence in list of integers?