Проверьте, является ли замороженный набор подмножеством списка и индексом каждого элемента, который является подмножеством

У меня есть куча 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 не определен, поэтому порядок списка индексов также не определен, поэтому вместо использования списка и подразумевания порядка, который не существует, используйте набор.

Другие вопросы по тегам