在列表中找到大小为n且小于n的最大重复

时间:2018-08-08 17:03:30

标签: python python-3.x

我有一个像这样的元素列表:

['x', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'g', 'h', 'i', 'i', 'i', 'i']

我想找到n及以下元素的所有“最大”重复,以及每个序列重复的次数。例如,如果n=3

>>> [(['a', 'b', 'c'], 3), (['g', 'h'], 2), (['i'], 4)]

我也不想返回(['i', 'i'], 2),因为涉及元素'i'的序列较长。

这是第二个条件:

['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'g', 'h', 'i', 'i', 'i', 'i']
>>> [(['a', 'b', 'c'], 3), (['b', 'c'], 2), (['g', 'h'], 2), (['i'], 4)]

接受属于2个不同重复的元素的重叠。

我当时正在考虑基于大小为n的滑动窗口并减小并跟踪已使用的索引的解决方案,但我不满足第一个条件。

有没有一种有效的方法?

2 个答案:

答案 0 :(得分:1)

您可以创建一个函数:

import re
def counting(x):
    d = re.sub(r"(?<=(\w))(?=\1)","\n","\n".join(re.findall(r"(\w+)(?=\1)",''.join(x)))).split()
    return  [(list(i),d.count(i)+1)for i in set(d)]

现在您可以在数据上运行此功能:

m = ['x', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'g', 'h', 'i', 'i', 'i', 'i']

counting(m)
[(['g', 'h'], 2), (['i'], 4), (['a', 'b', 'c'], 3)]


n = ['a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'g', 'h', 'i', 'i', 'i', 'i']

counting(n)
[(['g', 'h'], 2), (['i'], 4), (['a', 'b', 'c'], 3), (['b', 'c'], 2)]

答案 1 :(得分:0)

您可以使用正则表达式:

>>> li=['x', 'a', 'b', 'c', 'a', 'b', 'c', 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'g', 'h', 'i', 'i', 'i', 'i']
>>> [(t[0],''.join(t).count(t[0])) for t in re.findall(r'(\w+)(\1+)', ''.join(li))]
[('abc', 3), ('gh', 2), ('ii', 2)]

或者,

>>> [(list(t[0]),''.join(t).count(t[0])) for t in re.findall(r'(\w+)(\1+)', ''.join(li))
[(['a', 'b', 'c'], 3), (['g', 'h'], 2), (['i', 'i'], 2)]