我有一個這樣的名單:如何知道已經在python列表中的字符串的第一個和最後一個位置?
['MAR', 'TFFVGGNFK', 'LNGSK', 'QSIK', 'EIVER', 'LNTASIPENVEVVICPPATYLDYSVSLVK']
這曾經是一個字符串。我需要知道名單上的每個字符串的第一個和最後一個元素的位置,這樣做:
0-2 MAR
3-11 TFFVGGNFK
...
我該怎麼辦呢?
我有一個這樣的名單:如何知道已經在python列表中的字符串的第一個和最後一個位置?
['MAR', 'TFFVGGNFK', 'LNGSK', 'QSIK', 'EIVER', 'LNTASIPENVEVVICPPATYLDYSVSLVK']
這曾經是一個字符串。我需要知道名單上的每個字符串的第一個和最後一個元素的位置,這樣做:
0-2 MAR
3-11 TFFVGGNFK
...
我該怎麼辦呢?
foo = ['MAR', 'TFFVGGNFK', 'LNGSK', 'QSIK', 'EIVER', 'LNTASIPENVEVVICPPATYLDYSVSLVK']
count = 0
for bar in foo:
newcount = count + len(bar)
print count, '-', newcount-1, bar
count = newcount
不要調用一個變量'字符串。 – 2013-05-27 14:55:28
D'oh,忘了'string'模塊。改變它。 –
它是Python中的'str','string'模塊幾乎沒用。這是一個洗滌。 – millimoose
如果我理解正確的話,你也來加入你的列表:
text = ''.join(myList)
然後,你只需要index
它:
pos = text.index("MAR")
value = (pos, pos + len("MAR"))
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)
更有用,但我會假設你有你的理由。
優雅,如果不一定明顯。 – millimoose
如你想,在一個方法:
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
您在法看到。
+1:這基本上是DSM答案的天真等價物,所以它使算法更清晰。 – millimoose
試試這個:
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])
。
我不明白這個問題。將3-11作爲你的第二個字符串的開始和結束的索引**如果**你連接你的列表? – njzk2
是的,它會。但我無法獲得任何結果與函數索引...我是一個開始,也許我不是正確的 – user2425345