【发布时间】:2021-08-27 13:32:46
【问题描述】:
我有一个很长的列表,其中每个元素可以是 1 到 30 之间的数字,我需要获取所有 1、所有 2、所有 3 的索引......直到 30。我想我可以只使用索引() 并循环遍历 30,但该函数似乎只查找指定元素的第一次出现。谁能帮我解决这个问题?
【问题讨论】:
-
检查
enumerate -
请贴出试图“循环跨越 30”的代码。
我有一个很长的列表,其中每个元素可以是 1 到 30 之间的数字,我需要获取所有 1、所有 2、所有 3 的索引......直到 30。我想我可以只使用索引() 并循环遍历 30,但该函数似乎只查找指定元素的第一次出现。谁能帮我解决这个问题?
【问题讨论】:
enumerate
试试这个:
dct = {}
for j in range(1,31):
dct[j] = [i for i, x in enumerate(long_list) if x == j]
【讨论】:
这可以通过使用enumerate 来实现。
示例代码如下:
for j in range(1, 30):
print([i for i, e in enumerate([1,5,25,30]) if e == j])
【讨论】:
好吧,您确实可以使用index 方法。 index 方法还接受它开始查找指定元素的起始位置(如官方docs 中所述。可以这样做:
def index_all(x, l):
indices = []
start = 0
while start < len(l):
try:
i = l.index(x, start)
indices.append(i)
start = i + 1
except ValueError:
break
return indices
但是,如果您要查找多个值,而不仅仅是一个,则这可能不是执行此操作的最佳方法,因为您可以在一次运行中获取所有元素的索引。上面的代码在一般情况下实现了这一点,即使不是列表中的所有元素都是必需的。
def index_many(values, l):
indices = {v: [] for v in values}
for i, x in enumerate(l):
if x in indices:
indices[x].append(i)
return indices
【讨论】: