Дано:
x = ['w', 'e', 's', 's', 's', 'z','z', 's']
Каждое появление s появляется со следующими индексами:
1: 2
2: 3
3-й: 4
4: 7
Если я сделаю x.index('s'), я получу 1-й индекс.
Как получить индекс 4-го s?
Дано:
x = ['w', 'e', 's', 's', 's', 'z','z', 's']
Каждое появление s появляется со следующими индексами:
1: 2
2: 3
3-й: 4
4: 7
Если я сделаю x.index('s'), я получу 1-й индекс.
Как получить индекс 4-го s?
Используя понимание списка и enumerate:
>>> x = [ 'w', 'e', 's', 's', 's', 'z','z', 's']
>>> [i for i, n in enumerate(x) if n == 's'][0]
2
>>> [i for i, n in enumerate(x) if n == 's'][1]
3
>>> [i for i, n in enumerate(x) if n == 's'][2]
4
>>> [i for i, n in enumerate(x) if n == 's'][3]
7
Если вы не хотели хранить индексы для каждого вхождения или хотели работать с произвольными итерами, тогда что-то вроде:
from itertools import islice
def nth_index(iterable, value, n):
matches = (idx for idx, val in enumerate(iterable) if val == value)
return next(islice(matches, n-1, n), None)
x = [ 'w', 'e', 's', 's', 's', 'z','z', 's']
idx = nth_index(x, 's', 4)
# 7
Обратите внимание, что в next есть значение по умолчанию None. Вы можете изменить это на что-то еще или удалить его и поймать StopIteration и поднять как еще одно подходящее исключение (например, ValueError, так что оно больше связано с поведением list.index).
Для получения индекса элементов:
return [index for index, char in enumerate(x) if char == 's']
Для получения самого символа:
return [char for index, char in enumerate(x) if char == 's']
Или получить кортежи пар символов/индексов: (Благодаря falsetru для указания более простого решения)
pairs = [(index, char) for index, char in enumerate(x) if char == 's']
def find_nth_character(str1, substr, n):
"""find the index of the nth substr in string str1"""
k = 0
for index, c in enumerate(str1):
#print index, c, n # test
if c == substr:
k += 1
if k == n:
return index
str1 = "B.765.A87_43.Left.9878.xx8"
substr = '.'
occurance = 4
print "%s #%d at index %d" % (substr, occurance, find_nth_character(str1, substr, occurance))
Вот более питоновский подход с использованием itertools.count и выражения генератора:
In [24]: def get_nth_index(lst, item, n):
...: c = count()
...: return next(i for i, j in enumerate(x) if j=='s' and next(c) == n-1)
Демо:
In [25]: get_nth_index(x, 's', 2)
Out[25]: 3
In [26]: get_nth_index(x, 's', 3)
Out[26]: 4
In [27]: get_nth_index(x, 's', 4)
Out[27]: 7
In [28]: get_nth_index(x, 's', 5)
---------------------------------------------------------------------------
StopIteration Traceback (most recent call last)
<ipython-input-28-fc4e5e8c31ef> in <module>()
----> 1 get_nth_index(x, 's', 5)
<ipython-input-24-5394f79b3c30> in get_nth_index(lst, item, n)
1 def get_nth_index(lst, item, n):
2 c = count()
----> 3 return next(i for i, j in enumerate(x) if j=='s' and next(c) == n-1)
StopIteration:
In [29]:
Как вы можете видеть, это приведет к возникновению исключения StopIteration в случае, если он не сможет найти совпадение. Вы также можете передать аргумент по умолчанию функции next(), чтобы вернуть значение по умолчанию вместо повышения исключения.
просто мы можем расширить функциональность встроенного класса списка. унаследовав его.
In [64]: class List(list):
: def __init__(self, *val):
: self.extend(list(val))
:
:
: def findidx(self, val, n=None):
: '''return the occurances of an object in a list'''
:
: if n == None:
: return [i for i, v in enumerate(self) if v == val]
:
: return [i for i, v in enumerate(self) if v == val][n]
и есть два способа использовать этот класс. см. в следующем примере, чтобы понять.
In [65]: c = List(4, 5, 6, 7, 2, 5, 4 ,4) # enter the elements of the list as a argument
In [69]: c.findidx(4, 0) # search 4 0th(1) occurance
Out[69]: 0
In [72]: c.findidx(4, 1) # find 4 1st(2) occurance
Out[72]: 6
или
In [66]: c.findidx(4) # find all occurances of 4
Out[66]: [0, 6, 7]
In [67]: c.findidx(4)[0] # first occurance
Out[67]: 0
In [67]: c.findidx(4)[2] # third occurance
Out[67]: 7
In [69]: c[0]# for verification
Out[69]: 4
In [70]: c[7]
Out[70]: 4
"
Hhtitghfxbgkxgixhkc ydhkxhkcnvnv
Gudihcudzidufxkhclj СП vjzmbcfhIGNLVKHX CGJXDYOKJGGXKHCOHCKHVHIDYSXvhld tdgjdlfhof Vihxiyhdyidtiscatksydigchifgichilxhkcigcyipfohvtsuta, yfzigxitddgx Xguoarstdutd CigsrysuguixyigicxeRYRAZUGCCUOFHGFHF TSJGFLJVJOJVLNuoydjgdgidckhvljvljvljvhkctajdcknvgispigckhgxmb Iyxtudhc tdtucohouftistsohvlhvkhcigxstqesywqldllmfz Gxurarckydnlvirsyofyidohjgxxigigcvblryayigikhlbcmczvxnv, п