【问题标题】: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 处。

关于如何解决这个问题的任何提示?我的直觉告诉我可能需要一个嵌套循环。任何帮助,将不胜感激。

【问题讨论】:

  • 向我们展示您迄今为止的尝试!

标签: python list for-loop while-loop


【解决方案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 没有出现在 lst
  • nlst 中出现的次数少于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])
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多