2017-05-21 52 views
0

我有一堆frozensets,它們都是列表的子集。我想知道的是凍結集合的每個元素在列表中的位置。檢查凍結集是否是列表的一個子集,並且是子集的每個元素的索引

用於例如爲:

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

現在我已經知道了frozensets榜上有名l的一個子集。

我要的是列表中即當我檢查a,該函數返回列表中的l[0]1索引位置的項目的索引位置。

同樣對於b,它應該首先返回[1, 2]

回答

1

如果您已經知道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] 
0

如果l是恆定的,其項目是可哈希(他們必須是如果他們是一組的成員),那麼爲什麼不把索引:

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

如果l重複(len(l)!=len(set(l))),這可能會有問題。

然後從設定值返回索引集的功能是:

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

這將返回一組,而不是一個列表,因爲集合S的順序是不確定的,因此列表的順序的索引也是未定義的,所以不是使用列表並暗示不存在的訂單,而是使用集合。

相關問題