[英]How to find the index of the nth time an item appears in a list?
Given:鉴于:
x = ['w', 'e', 's', 's', 's', 'z','z', 's']
Each occurrence of s
appears at the following indices: s
每次出现都出现在以下索引处:
1st: 2第一名:2
2nd: 3第二名:3
3rd: 4第三名:4
4th: 7第四名:7
If I do x.index('s')
I will get the 1st index.如果我做x.index('s')
我会得到第一个索引。
How do I get the index of the 4th s
?如何获得第 4 s
的索引?
Using list comprehension andenumerate
:使用列表理解和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
If you didn't want to store the indices for each occurrence, or wanted to work with arbitrary iterables then something like:如果您不想为每次出现存储索引,或者想使用任意可迭代对象,则类似于:
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
Note there's a default value of None
there in the next
.请注意, next
有一个默认值None
。 You may wish to change that to something else, or remove it and catch the StopIteration
and raise as another more suitable exception ( ValueError
for instance, so that it ties up more with list.index
behaviour).您可能希望将其更改为其他内容,或者将其删除并捕获StopIteration
并将其作为另一个更合适的异常引发(例如ValueError
,以便它与list.index
行为有更多联系)。
For getting the index of the items:获取项目的索引:
return [index for index, char in enumerate(x) if char == 's']
For getting the character itself:获取角色本身:
return [char for index, char in enumerate(x) if char == 's']
Or to get tuples of character/index pairs: (Thanks to falsetru for pointing out a simpler solution)或者获取字符/索引对的元组:(感谢 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))
Here is a more Pythonic approach using itertools.count
and a generator expression:这是使用itertools.count
和生成器表达式的更 Pythonic 的方法:
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)
Demo:演示:
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]:
As you can see, it will raise an StopIteration
exception in case it can't find a match.如您所见,如果找不到匹配项,它将引发StopIteration
异常。 You can also pass a default argument to next()
function to return a default value instead of raising exception.您还可以将默认参数传递给next()
函数以返回默认值而不是引发异常。
simply we can extend the functionality of the built-in list class.我们可以简单地扩展内置列表类的功能。 by inheriting it.通过继承它。
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]
and there are two ways to use this class.有两种方法可以使用这个类。 see in the following example to understand.看下面的例子来理解。
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's 0th(1) occurance
Out[69]: 0
In [72]: c.findidx(4, 1) # find 4's 1st(2) occurance
Out[72]: 6
or或者
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
` `
You can use this to find in last position您可以使用它来查找最后一个位置
where a is the array其中 a 是数组
t=(a.index(0)+a.count(0))-1
You can increase the number to -2 or -3 to find the position of the desired number from last您可以将数字增加到 -2 或 -3 以从最后找到所需数字的位置
NOTE: The list must be sorted.注意:必须对列表进行排序。 You can sort it with sort ()您可以使用 sort() 对其进行排序
eg: a.sort()
例如: a.sort()
for more inbuilt function in list click here有关列表中的更多内置功能,请单击此处
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.