我有一个包含数百个整数的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处。
有关如何处理此问题的任何提示?我的预感告诉我可能需要嵌套循环。任何帮助,将不胜感激。
答案 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
进行迭代会产生index
和value
。然后,列表推导使用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
n
在k
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]