- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
def get(a='',x=-1):
b,c,d,e,f=a.split('\n'),[],[],0,0
for i in range(len(b)):
if i==0: c+=[i]; e+=len(b[i])+1; f+=len(b[i]); d+=[f]
elif i==len(b)-1: f+=len(b[i]); d+=[f]; c+=[e]
else: f+=len(b[i])+1; c+=[e]; d+=[f]; e+=len(b[i])+1
for i in range(len(c)):
if range(c[i], d[i]+1).count(x): return i
Это код чувака, который хочет получить индекс строки по индексу символа.
>>> get('a\nb', 0) # 0 - позиция символа "а"
0
>>> get('a\nb', 1) # 1 - позиция символа "\n"
0
>>> get('a\nb', 2) # 2 - позиция символа "b" (уже вторая строка)
1
Простой эквивалент кода:
GetNewlineCount = lambda s, p: s.count('\n', 0, p)
guest 16.08.2011 17:41 # 0
guest 16.08.2011 17:45 # 0
gegMOPO4 16.08.2011 19:49 # 0
А если взять get('a'+'\nb'*10,20), то разница будет ещё разительнее.
Niceblack 17.08.2011 00:37 # 0
Вот тест на нетбуке:
get("a\\nbcdefghi\\n\\nkkkk\\ns,,,s,,,s\ \ntrollollo\\n12334566",20) # 3.4331777255
get1("a\\nbcdefghi\\n\\nkkkk\\ns,,,s,,,s \\ntrollollo\\n12334566",20) # 85.8690221341
da4ever 17.08.2011 03:43 # 0
gegMOPO4 17.08.2011 23:12 # +1
da4ever 18.08.2011 05:31 # 0
>>> timeit('get("a\\nb",1)',setup='from __main__ import get')
0.6096830368041992
>>> timeit('get("a\\nb",1)',setup='from __main__ import get1 as get')
5.789045095443726
лямбда то быстрее.
gegMOPO4 18.08.2011 20:48 # −1
guest8 09.04.2019 11:20 # −999