2015-04-06 111 views
2

我有形式的元素序列的所有可能的序列:创建独特的元素

A111 T112 I113 A114 S115 I116 D117 F118 K119 R120 E121 T122 C123 V124 V125 V126 T112

与约束每个元素只发生一次。在上面的序列中T112发生两次。所以,我需要创建一个满足约束,即所有可能的子序列:

T112 I113 A114 S115 I116

I116 K119 R120 E121 T122 C123 V124 V125 V126 T112

在更复杂场景我有以下序列必须满足相同的约束:

A111 T112 I113 A114 T112 S115 I116 D117 I116 K119 R120 E121 T122 C123 V124 V125 V126

这次T112也I116发生两次。在这种情况下,我需要以下子序列:

A111 T112 I113 A114

I113 A114 T112 S115 I116 D117

D117 I116 K119 R120 E121 T122 C123 V124 V125 V126

当然,一个元素可能会出现两次以上。没有使用遗传算法解决这个问题的有效方法吗?

+0

你需要给更多的采样输入和输出。我完全不确定*你想要什么。 – pzp

+0

我想我可以看到子序列应该是什么,但是你能否更清楚一些?实际的规则是什么? – jksnw

+0

每个序列的分隔符是什么? –

回答

1

代码:

list = ["A111", "T112", "I113", "A114", "T112", "S115", "I116", "D117", "I116", "K119", "R120", "E121", "T122", "C123", "V124", "V125", "V126"] 

subsequence = [] 
for item in list: 
    if item in subsequence: 
     print subsequence 
     index = subsequence.index(item)+1 
     subsequence = subsequence[index:] 
    subsequence.append(item) 
print subsequence 

会打印:

['A111', 'T112', 'I113', 'A114'] 
['I113', 'A114', 'T112', 'S115', 'I116', 'D117'] 
['D117', 'I116', 'K119', 'R120', 'E121', 'T122', 'C123', 'V124', 'V125', 'V126'] 
+0

聪明!它也适用于如下更复杂的情况:list = [“A111”,“T112”,“I113”,“A114”,“X100”,“I116”,“X101”,“T112”,“S115”, I116,D117,I116,K119,R120,E121,T122,C123,V124,V125,V126, – tevang

0

您可以维护一个正在运行的集合,来跟踪字符串重复:

def partitions(s): 

    lst = s.split() 
    flags = set() 
    for l in lst: 
     if l in flags: 
      yield list(flags) 
      flags.clear() 
     flags.add(l) 
    yield list(flags) 

>>> s = "A111 T112 I113 A114 T112 S115 I116 D117 I116 K119 R120 E121 T122 C123 V124 V125 V126" 
>>> x = partitions(s) 
>>> print list(x) 
[['A111', 'I113', 'T112', 'A114'], ['D117', 'S115', 'T112', 'I116'], ['R120', 'T122', 'E121', 'V125', 'V124', 'V126', 'C123', 'K119', 'I116']]