2015-07-01 21 views
-2

假設我們有一個這樣的句子:"ABCDEFG",以及一個標記列表:[0,0,1,0,0,0,1]。我打算做的是通過使用標記列表將源字符串拆分爲段:如果一個字符在源字符串中具有索引i,並且通過使用該索引,我們可以在標記列表中獲得1,那麼這個字符是一個詞的結尾。如何通過python中的標記列表來分割字符串?

所以源字符串可以被分成['ABC', 'DEFG']

如何在Python實現這一目標?我的意思是,不像使用臨時緩衝區那樣簡單。

+0

它根本不清楚你想達到什麼目的。 –

+0

這個問題更適合發佈在http://codegolf.stackexchange.com/ 這是什麼意思的'別的'? :-) –

+0

在Python'itertools'文檔中使用'groupby'方法:https://docs.python.org/3/library/itertools.html#itertools.groupby – Sam

回答

0

我們可以用簡單的for循環來達致這 -

>>> s = "ABCDEFG" 
>>> l = [0,0,1,0,0,0,1] 
>>> 
>>> endlist = [] 
>>> tsh = '' 
>>> for i, ch in enumerate(s): 
...  tsh += ch 
...  if l[i] == 1: 
...    endlist.append(tsh) 
...    tsh = '' 
... 
>>> endlist 
['ABC', 'DEFG'] 
+1

我在這裏很挑剔,但是你應該把這些字符追加到一個數組中,然後在最後加入它。你現在做的方式是O(n^2) - 將字符附加到字符串是O(n),其中n是字符串的長度。 – James

+0

@詹姆斯,如果只有一個字符串的引用,添加到字符串的末尾是攤銷O(1) –

+0

@JohnLaRooy,謝謝指出!我不知道這個。 – James

0

一個簡單的方法是:

temp = "ABCDEFG" 
t = [0,0,1,0,0,0,1] 
f_i, e_i = 0,0 
for index,val in enumerate(t): 
    if val: 
     e_i = index +1 
     print temp[f_i: e_i ]  #Here you can store these as you wish 
     f_i = e_i 
0

.index可能找到1 S上的最快的方法。也使您能夠將源字符串直接

s = "ABCDEFG" 
L = [0,0,1,0,0,0,1] 

pos = 0 
res = [] 
while True: 
    try: 
     idx = L.index(1, pos) + 1 
    except ValueError: 
     break 
    res.append(s[pos: idx]) 
    pos = idx 

print(res) 
+0

我真的很喜歡你的想法!然而,有沒有關於「索引是最快爲什麼找到1」的參考? – VELVETDETH

0

一個簡單的回答:

l = [0,0,1,0,0,0,1] 
s = 'ABCDEFG' 
indices = [i for i, x in enumerate(l) if x == 1] 
t = 0 
a = [] 
for i in indices: 
    a.append(s[t:i+1]) 
    t = i+1 
print(a) 
0

一個主題的另一個變化。

marks = [0,0,1,0,0,0,1] 
sentence = 'ABCDEFG' 

output = [] 
last_index = 0 

for index, mark in enumerate(marks): 
    if mark: 
     output.append(sentence[last_index:index+1]) 
     last_index = index+1 

print(output) 
相關問題