2013-05-27 79 views
2

我有一個這樣的名單:如何知道已經在python列表中的字符串的第一個和最後一個位置?

['MAR', 'TFFVGGNFK', 'LNGSK', 'QSIK', 'EIVER', 'LNTASIPENVEVVICPPATYLDYSVSLVK'] 

這曾經是一個字符串。我需要知道名單上的每個字符串的第一個和最後一個元素的位置,這樣做:

0-2 MAR 
3-11 TFFVGGNFK 
... 

我該怎麼辦呢?

+2

我不明白這個問題。將3-11作爲你的第二個字符串的開始和結束的索引**如果**你連接你的列表? – njzk2

+0

是的,它會。但我無法獲得任何結果與函數索引...我是一個開始,也許我不是正確的 – user2425345

回答

2
foo = ['MAR', 'TFFVGGNFK', 'LNGSK', 'QSIK', 'EIVER', 'LNTASIPENVEVVICPPATYLDYSVSLVK'] 

count = 0 
for bar in foo: 
    newcount = count + len(bar) 
    print count, '-', newcount-1, bar 
    count = newcount 
+1

不要調用一個變量'字符串。 – 2013-05-27 14:55:28

+1

D'oh,忘了'string'模塊。改變它。 –

+1

它是Python中的'str','string'模塊幾乎沒用。這是一個洗滌。 – millimoose

-1

如果我理解正確的話,你也來加入你的列表:

text = ''.join(myList) 

然後,你只需要index它:

pos = text.index("MAR") 
value = (pos, pos + len("MAR")) 
4

Python 3的解決方案,使用itertools.accumulate

>>> from itertools import accumulate 
>>> a = ['MAR', 'TFFVGGNFK', 'LNGSK', 'QSIK', 'EIVER', 'LNTASIPENVEVVICPPATYLDYSVSLVK'] 
>>> starts = [0] + list(accumulate(map(len, a))) 
>>> starts 
[0, 3, 12, 17, 21, 26, 55] 
>>> pairs = [(l,r-1) for l,r in zip(starts, starts[1:])] 
>>> pairs 
[(0, 2), (3, 11), (12, 16), (17, 20), (21, 25), (26, 54)] 

請記住,由於Python的切片工作方式有(0,3)通常比(0, 2)更有用,但我會假設你有你的理由。

+0

優雅,如果不一定明顯。 – millimoose

2

如你想,在一個方法:

from collections import OrderedDict 
lst = ['MAR', 'TFFVGGNFK', 'LNGSK', 'QSIK', 'EIVER', 'LNTASIPENVEVVICPPATYLDYSVSLVK'] 

def indexes(l): 
    start = 0 
    indexes = OrderedDict() 
    for i in l: 
     end = start+len(i)-1 
     indexes[i] = (start, end) 
     start = end+1 
    return indexes 

print indexes(lst) 
>>> 
OrderedDict([('MAR', (0, 2)), ('TFFVGGNFK', (3, 11)), ('LNGSK', (12, 16)), ('QSIK', (17, 20)), ('EIVER', (21, 25)), ('LNTASIPENVEVVICPPATYLDYSVSLVK', (26, 54))]) 

但我會改變指標是沒有「偏移」,並刪除-1+1您在法看到。

+0

+1:這基本上是DSM答案的天真等價物,所以它使算法更清晰。 – millimoose

0

試試這個:

list = ['MAR', 'TFFVGGNFK', 'LNGSK', 'QSIK', 'EIVER', 'LNTASIPENVEVVICPPATYLDYSVSLVK'] 
lenlist = [] 
for s in list: 
    lenlist.append(len(s)) 

現在名單lenlist將包含每個字符串的長度。從這裏你可以使用一個for循環獲得的開頭和結尾:

belist = [] # list containing beginning & end 
for i in range(len(lenlist)): 
    belist.append(0) 
    for j in range(i): 
     belist[i].append(lenlist[j]) 
    belist[i] = str(belist[i]) + '-' + str(lenlist[i]) 

我認爲這應該工作:)

順便說一句,你的開頭和結尾將由-分開,把他們在一個列表中,用belist[i] = (belist[i], lenlist[i])代替行belist[i] = str(belist[i]) + '-' + str(lenlist[i])

相關問題