我有一个像这样的元素列表:
['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
的滑动窗口并减小并跟踪已使用的索引的解决方案,但我不满足第一个条件。
有没有一种有效的方法?
答案 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)]