2015-04-06 110 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']]