如果我有这份清单清单:
[[1,2,3,4],[5,6,7,8,9,10],[11,12,13]]
我怎样才能根据给定的值找到子列表本身的索引?
例如:
如果我的值为2,则返回的索引将为0
如果我的值为9,则返回的索引为1
如果我的值为11,则索引为2
答案 0 :(得分:3)
只需使用enumerate
:
l = [[1,2,3,4],[5,6,7,8,9,10],[11,12,13]]
# e.g.: find the index of the list containing 12
# This returns the first match (i.e. using index 0), if you want all matches
# simply remove the `[0]`
print [i for i, lst in enumerate(l) if 12 in lst][0]
输出:
[2]
编辑:
@hlt's评论建议使用以下内容来提高效率:
next(i for i,v in enumerate(l) if 12 in v)
答案 1 :(得分:3)
如果您想要所有索引,或者如果您只想要第一个出现,请使用@ jrd1演示的list-comp,然后:
next((idx for idx, val in enumerate(your_list) if 2 in val), None)
我们在此处使用None
作为默认值,而不是在任何子列表中找不到值的StopIteration
。如果您希望引发异常,请删除默认值。
答案 2 :(得分:1)
如果您有许多查询和/或动态列表列表,那么您最好制作地图。特别是一个值:设置地图。将值映射到包含该值的一组索引(子列表)的位置。虽然如果列表没有变化,这种方法效果最好。
[[1,2,3,4],[5,6,7,8,9,10], [11,12,13], [1,2,3,4,5,6,7,8,9,10,11,12,13]
的示例:
# Code for populating the map
map = collections.defaultdict(set)
index = 0
for i,v in enumerate(l):
for _ in v:
map[index].add(i)
index += 1
# Result:
map = {
1: {0,3},
2: {0,3},
3: {0,3},
4: {0,3},
5: {1,3},
6: {1,3},
7: {1,3},
8: {1,3},
9: {1,3},
10:{1,3},
11:{2,3},
12:{2,3},
13:{2,3}
}
您还可以将子列表视为间隔(涵盖一系列索引)并允许O(log N)查找和O(log N)通过构建interval tree来添加/删除子列表/元素。它需要O(L log L)来构建区间树,其中L是子列表的数量。
答案 3 :(得分:0)
这是一个(虽然效率低,但简洁)递归解决方案:
def get_index(lst, num, index=0):
if num in lst[index]:
return index
else:
return get_index(lst, num, index + 1)