【发布时间】:2019-12-19 13:46:35
【问题描述】:
我正在尝试制作一个 python 列表模式查找器。我的第一个想法是获取列表中的第一个值,然后找到下一个相同值的出现。那将是潜在的模式序列长度,然后我将检查从第一个数字到第二个数字的数字是否等于潜在模式序列长度范围内的第二个数字之后的值。
例如:
如果我有这份清单
[1, 2, 6, 1, 2, 6, 1, 2, 6, 7, 8, 7, 8]
然后它将采用第一个数字1 并采用列表中第二个1 的索引减去第一个数字的索引。所以3 - 0 = 3,那就是模式长度。然后它会检查是否list[:3] == list[3:3 + pattern length]。依此类推,直到模式不匹配。最终结果将是[[3, [1, 2, 6]], [2, [7, 8]]]。最好有一个字典作为输出,但如果两个模式相同,字典将不起作用,因为它不能有两个相同的键。
我发现这种方法不是很有效,而且我的功能也没有完全成功,所以我想知道是否有人可以帮助我提供另一个模式查找器功能的想法,或者是否有一个 python 模块。
我在网上找到了这个:https://regex101.com/r/Vdhjld/1,这正是我想要的,但我的实际列表非常大,使用它需要很长时间。关于我应该做什么的任何想法?
如果描述不清楚,请评论
【问题讨论】:
-
您描述的方法是错误的。例如:
[1,2,1,3,1,2,1,3]结果应该是[[2,[1,2,1,3]]]对吧?而不是[[1,[1,2]],[1,[1,3]],[1,[1,2]],[1,[1,3]]] -
如果是
[1, 2, 1, 2, 4, 5, 1, 2, 1, 2, 4, 5],你会期待什么?如果数字相同会发生什么?例如[1, 1, 1, 1]是模式[1, [1], 1, [1],...]还是[4, [1, 1, 1, 1]]? -
@Raj 抱歉,如果我解释不好,是的,结果应该是
[[2,[1,2,1,3]]],这就是我的方法很愚蠢的原因。 -
@DenFulaAnkungen 所以你不是在寻找最长的模式,而是最短的模式?
-
@LeoE 对不起,不。输出应该是
[[2, [1, 2, 1, 2, 4, 5]]]。我会更新我的答案。对不起,我没有仔细查看列表。或者可能是[[2, [[2, [1, 2]], 4, 5]]
标签: python python-3.x list function dictionary