在列表中查找特定值的每三个实例
Posted
技术标签:
【中文标题】在列表中查找特定值的每三个实例【英文标题】:find every third instance of specific value in a list 【发布时间】:2018-11-06 16:05:36 【问题描述】:我有一个 python 列表,其中包含数百个整数,范围从 1 到 6(含)。本质上,我想创建一个函数来查找每三个 6 实例的索引。考虑这个例子:
l = [5, 2, 2, 1, 4, 5, 4, 6, 6, 5, 5, 3, 3, 2, 1, 3, 5, 3, 5, 2, 4, 4, 2, 3, 3, 2, 6, 2, 3, 6, 3, 6, 1, 6]
6_finder(l)
> [26, 33]
在此示例中,6 的第三个实例出现在索引 26 处,6 的下一个第三个实例出现在索引 33 处。
关于如何解决这个问题的任何提示?我的直觉告诉我可能需要一个嵌套循环。任何帮助,将不胜感激。
【问题讨论】:
向我们展示您迄今为止的尝试! 【参考方案1】:查找6
的所有实例并获取每个3
rd。
l = [5, 2, 2, 1, 4, 5, 4, 6, 6, 5, 5, 3, 3, 2, 1, 3, 5, 3, 5, 2, 4, 4, 2, 3, 3, 2, 6, 2, 3, 6, 3, 6, 1, 6]
res = [i for i, x in enumerate(l) if x == 6][2::3]
print(res)
打印出来的
[26, 33]
解释@BrettBeatty:
迭代
enumerate
会产生index
和value
。然后列表理解使用value
来检查它是否为6
,如果是,则返回index
。然后对这些收集到的索引进行切片,从第三个元素 (index
2) 开始,步长为 3。
通常,您可以将这一切巧妙地打包在一个函数中,该函数返回一个列表,其中包含n
的每个k
th 实例的索引:
def get_index_of_kth_n(lst, n, k=1):
return [i for i, x in enumerate(lst) if x == n][k-1::k]
它还处理极端情况,例如:
lst
传递的是空的
n
没有出现在 lst
中
n
在lst
中出现的次数少于k
次
在上述所有情况下,都会返回一个空列表 ([]
)。
不支持负的 k
值。
【讨论】:
只是为了解释它的作用:迭代enumerate
会产生一个索引和一个值。然后列表理解使用该值来检查它是否为6
,如果是,则生成索引。该列表推导返回一个索引列表,然后从第三个元素(索引 2)开始切片,步长为 3——返回一个列表或切片,每三个索引只有一个。【参考方案2】:
这是一个可以解决问题的函数。
In [13]: def get_every_3rd_instance(mylist, item):
...: count = 0
...: idx_list = []
...: for idx, i in enumerate(mylist):
...: if i == item:
...: count += 1
...: if count == 3:
...: idx_list.append(idx)
...: count = 0
...:
...: return idx_list
In [14]: get_every_3rd_instance(l, 6)
Out[14]: [26, 33]
【讨论】:
【参考方案3】:如果它不适合你,请告诉我
import numpy as np
sixes = np.where(l=6)
l_sixes = l[sixes]
for i in range(len(3,l_sixes,3)):
print (l_sixes)
【讨论】:
你的意思是for i in range(..
【参考方案4】:
我会这样做,更通用一点:
l = [5, 2, 2, 1, 4, 5, 4, 6, 6, 5, 5, 3, 3, 2, 1, 3, 5, 3, 5, 2, 4, 4, 2, 3, 3, 2, 6, 2, 3, 6, 3, 6, 1, 6]
def val_finder(arr, val):
res = []
for i in range(0,len(arr)):
if arr[i] == val:
res.append(i)
return res
vals = val_finder(l, 6)
print(vals)
print(vals[2::3])
【讨论】:
以上是关于在列表中查找特定值的每三个实例的主要内容,如果未能解决你的问题,请参考以下文章