Python 从小长度序列中寻找序列

Python 从小长度序列中寻找序列,python,sequence,Python,Sequence,我想通过使用特定格式的一些事件来生成一个空间。让我用一个小例子来解释这个问题 假设我有事件a,b,c,d,e,f。我将有3个长度的序列作为这些事件的输入。从这些序列中,我想生成6个长度(事件数)的序列,序列中不会有重复的元素,即每个事件只使用一次。长度为6的序列需要满足一些规则 例如: Input: list1:['a','b','c'] list2:['c','d','e'] list3:['b','c','d'] list4:['a','c','g'] list5:['f','g','e'

我想通过使用特定格式的一些事件来生成一个空间。让我用一个小例子来解释这个问题

假设我有事件a,b,c,d,e,f。我将有3个长度的序列作为这些事件的输入。从这些序列中,我想生成6个长度(事件数)的序列,序列中不会有重复的元素,即每个事件只使用一次。长度为6的序列需要满足一些规则

例如:

Input: 
list1:['a','b','c']
list2:['c','d','e']
list3:['b','c','d']
list4:['a','c','g']
list5:['f','g','e'] 
清单1描述了,在6长度序列中,b和c将位于a之后,c将位于b之后,也就是说,当顺序改变时,序列也会改变。清单2以同样的方式描述了d和e将在c之后,e将在d之后。所有的名单都会被记录下来。在从这些序列中提取所有规则之后,我需要生成遵守规则的6长度序列。例如,

在我们的例子中(为了简单起见),输入是List1、List2和List3

Input: 
list1:['a','b','c']
list2:['c','d','e']
list3:['b','c','d']
然后给出了这些列表的一些结果

['a','b','c','d','e']
:它遵守从这三个列表中提取的所有规则,就像b和c在a之后,d和e在c之后,c和d在b之后。İ重要注意:从这里开始,如果c需要在a之后,它们不需要在输出序列中相邻(6-长度)

不能保证6长度序列始终存在。首先,需要检查至少有一个这样的序列。否则,算法应该返回false。例如,;假设我们的输入是Lis1、Lis2、Lis3、Lis4和Lis5

Input: 
list1:['a','b','c']
list2:['c','d','e']
list3:['b','c','d']
list4:['a','c','g']
list5:['e','g','b'] 
a=>b=>c=>g=>b这是不可能的,因为b不能在它自己后面

我需要一个在Python中生成这些序列的算法。我现在没有任何代码,因为到目前为止我还没有想到任何有效的算法。在寻找更长的序列时,它也需要非常有效

如果问题不清楚,请现在告诉我


谢谢

这里有一个起点:

import networkx as nx
from itertools import tee, izip

list1 = ['a','b','c']
list2 = ['c','d','e']
list3 = ['b','c','d']

g = nx.DiGraph()
for items in [list1, list2, list3]:
    a, b = tee(items)
    next(b)
    g.add_edges_from(izip(a, b))

print nx.topological_sort(g)
# ['a', 'b', 'c', 'd', 'e']

如果图形包含循环,这将引发异常…

您可以按以下方式构建模型。python库将为您处理所有图形内容

要生成随机的6元素序列,可以枚举所有可能的序列,然后从具有6元素的序列中随机选取

(糟糕但有效)算法的草图:

  • 从Jon的示例开始—构建图形并确保该图形是DAG
  • P是节点向量,开头为空
  • 从图中选择一个随机节点,将该节点添加到P
  • 选择一个随机的邻居节点
  • 将新节点添加到P
  • 如果P具有所需的长度(10或20或其他),则P是有效的结果
  • 否则,请转到4

  • 也许DAG(有向无环图)会有用,我以前没有使用过任何图算法,你能提供一些参考吗?正如我在问题中所说的,6-length只是为了简单地解释这个问题。我将使用它超过10个长度,最多20个或更多。因此,枚举不是一个解决方案。如果您不喜欢枚举所有这些,您可以遍历DAG,随机分支并输出满足长度要求的解决方案。我该怎么做?你能举个类似的例子吗?我试试看。如果我能做到,速度会更快。稍后,我将需要使用100长度。因此,优化算法是非常重要的。谢谢你的回答。很抱歉迟了回复。它工作得很好。我编辑了引发异常部分,如果有非循环,它将返回false。谢谢你的回答。