Проверьте, является ли замороженный набор подмножеством списка и индексом каждого элемента, который является подмножеством
У меня есть куча frozensets
и все они являются подмножествами списка. То, что я хочу выяснить, это положение каждого элемента замороженного набора в списке.
например:
a = frozenset([1])
b = frozenset([2, 3])
l = [1, 2, 3, 4]
Теперь я уже знаю, что Frozensets являются подмножеством списка l
,
То, что я хочу, это позиция индекса в списке, т.е. когда я проверяю a
, функция должна возвращать позицию индекса для 1
в списке l
т.е. [0]
,
Аналогично для b
, он должен сначала вернуться [1, 2]
,
2 ответа
Если вы уже знаете a
а также b
являются подмножествами, просто используйте понимание списка, чтобы собрать индексы значений, которые являются членами; использовать enumerate()
Функция для обеспечения индексов:
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))
).
тогда функция, которая возвращает набор индексов из набора значений:
def indexes(S):
return set(idx[v] for v in S)
Это возвращает набор, а не список, потому что порядок набора S не определен, поэтому порядок списка индексов также не определен, поэтому вместо использования списка и подразумевания порядка, который не существует, используйте набор.