检查冻结集是否是列表的子集以及作为子集的每个元素的索引

Check to see if frozen set is a subset of list and the index of every element that is a subset

我有一堆 frozensets 它们都是列表的子集。我想知道的是冻结集合的每个元素在列表中的位置。

例如:

a = frozenset([1])
b = frozenset([2, 3])
l = [1, 2, 3, 4]

现在我已经知道 frozensets 是列表的一个子集 l

我想要的是列表中项目的索引位置,即当我检查 a 时,函数应该 return 列表中 1 的索引位置 l[0].

b类似,它应该首先return [1, 2]

如果您已经知道 ab 是子集,只需使用列表理解来收集作为成员的值的索引;使用 enumerate() function 提供索引:

result = [i for i, v in enumerate(l) if v in subset]

其中 subset 是您的 frozenset 个实例之一。

演示:

>>> a = frozenset([1])
>>> b = frozenset([2, 3])
>>> l = [1, 2, 3, 4]
>>> [i for i, v in enumerate(l) if v in a]
[0]
>>> [i for i, v in enumerate(l) if v in b]
[1, 2]

如果 l 是常量并且它的项目是可散列的(如果它们是集合的成员则它们必须是散列的),那么为什么不创建索引:

idx = {v:i for i,v in enumerate(l)}

如果 l 有重复项 (len(l)!=len(set(l))),这可能会有问题。

那么 returns 一组值中的一组索引的函数是:

def indexes(S):
    return set(idx[v] for v in S)

这个 returns 是一个集合而不是一个列表,因为集合 S 的顺序是未定义的,所以索引列表的顺序也是未定义的,所以而不是使用列表并暗示一个未定义的顺序存在,用一套。