Дано:
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, п