次のようなリストがあります。
['MAR', 'TFFVGGNFK', 'LNGSK', 'QSIK', 'EIVER', 'LNTASIPENVEVVICPPATYLDYSVSLVK']
以前は文字列でした。次のようなことを行うには、リスト上の各文字列の最初と最後の要素の位置を知る必要があります。
0-2 MAR
3-11 TFFVGGNFK
...
どうすればできますか?
を使用した 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)
ですが、理由があると仮定します。
あなたが望むように、メソッドで:
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
ただし、インデックスを「オフセット」なしに変更し、メソッドに表示されるandを削除+1
します。
foo = ['MAR', 'TFFVGGNFK', 'LNGSK', 'QSIK', 'EIVER', 'LNTASIPENVEVVICPPATYLDYSVSLVK']
count = 0
for bar in foo:
newcount = count + len(bar)
print count, '-', newcount-1, bar
count = newcount
これを試して:
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] = str(belist[i]) + '-' + str(lenlist[i])
をに置き換えbelist[i] = (belist[i], lenlist[i])
ます。
私の理解が正しければ、リストに参加する必要があります:
text = ''.join(myList)
その後、あなたはそれをするだけですindex
:
pos = text.index("MAR")
value = (pos, pos + len("MAR"))