在列表中查找特定值的每三个实例

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 的所有实例并获取每个3rd

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 会产生indexvalue。然后列表理解使用value 来检查它是否为6,如果是,则返回index。然后对这些收集到的索引进行切片,从第三个元素 (index2) 开始,步长为 3。


通常,您可以将这一切巧妙地打包在一个函数中,该函数返回一个列表,其中包含n 的每个kth 实例的索引:

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 没有出现在 lstnlst 中出现的次数少于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])

【讨论】:

以上是关于在列表中查找特定值的每三个实例的主要内容,如果未能解决你的问题,请参考以下文章

在列表中查找具有特定值的对象

Python二分搜索类函数,用于查找排序列表中大于特定值的第一个数字

搜索特定值的嵌套字典列表[重复]

在 Boto3 中获取具有特定标签和值的 EC2 实例列表

命名查询根据包含某些值的列表(实例变量)查找所有实体

列表以逗号开头时查找列表中的特定实例