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

时间:2018-05-28 05:59:53

标签: python list for-loop while-loop

我有一个包含数百个整数的python列表,范围从1到6(含)。本质上,我想创建一个函数来查找每个第三个实例的索引6.考虑这个例子:

$response->say(
    'You have joined the conference.',
    ['voice' => 'alice', 'language' => 'en-GB']
);



$response->dial(
    $vb,array(
    'record' => True,
    'hangupOnStar' => 'true',
    'url' => "http://demo.twilio.com/docs/voice.xml",
    'recordingStatusCallback' => "myurl/phone_module_html.php"
)
);

$dial->conference(
        $roomName, 
        array(
            'startConferenceOnEnter' => 'true',
            'endConferenceOnExit' => 'false',
            'muted' => 'false',
            'record' => 'record-from-start',
            'waitUrl' => 'http://twimlets.com/holdmusic?Bucket=com.twilio.music.ambient',
        )
    );

在这个例子中,6的第三个实例出现在索引26处,6的下一个第三个实例出现在索引33处。

有关如何处理此问题的任何提示?我的预感告诉我可能需要嵌套循环。任何帮助,将不胜感激。

4 个答案:

答案 0 :(得分:9)

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

通常,您可以将这一切整齐地打包在一个函数中,该函数返回一个列表,其中包含k的每个n 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
  • nk
  • 中显示的时间少于lst

在上述所有情况下,都会返回一个空列表([])。 不支持负k值。

答案 1 :(得分:0)

如果它不适合你,请告诉我

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)

答案 2 :(得分:0)

我会这样做,这更通用:

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])

答案 3 :(得分:-1)

这是一个可以解决问题的功能。

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]