我有一个这样的列表:
['MAR', 'TFFVGGNFK', 'LNGSK', 'QSIK', 'EIVER', 'LNTASIPENVEVVICPPATYLDYSVSLVK']
这曾经是一个字符串。我需要知道列表中每个字符串的第一个和最后一个元素的位置,才能执行以下操作:
0-2 MAR
3-11 TFFVGGNFK
...
我该怎么做呢?
发布于 2013-05-27 22:54:37
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 23:01:51
Python3解决方案,使用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)
更有用,但我假设您有自己的理由。
发布于 2013-05-27 23:13:30
正如您所希望的,在一种方法中:
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
。
https://stackoverflow.com/questions/16775623
复制相似问题