2015-05-05 5 views
-1

Я работаю на Python. У меня есть большой список L = [X_{1}, X_{2}, ....,X_{n}], где каждый X_{i} - это набор. Возможно, что для некоторых отдельных индексов i, j имеем X_{i} = X_{j}. Я хочу создать список (или набор) L_{1} = [Y_{1}, Y_{2}, ... ,Y_{k}], так что множество (в математическом смысле) {X_{1},..., X_{n}} = {Y_{1}, ..., Y_{k}} и L_{1} имеет наименьшую возможную длину (другими словами L_{1} не имеет повторений).Набор из списка наборов

Для последующих применений мне необходимо получить доступ к элементам L_{1}. Поэтому я не могу использовать опцию frozenset.

set(L) имеет значение TypeError: unhashable type: 'set'.

Я думаю, что смогу его решить, используя контурную конструкцию, но мне интересно, есть ли более элегантное решение этой проблемы в Python.

+0

Каким образом 'набор (L)' не работает? Как выглядит ваш список? – khelwood

+0

@khelwood: потому что наборы изменяемы и не могут быть сохранены в другом наборе. –

+0

@MartijnPieters (я знал это, я просто подумал, что плакат должен был дать лучшее описание проблемы, чем «не выполняет работу».) – khelwood

ответ

6

Если вы хотите исключить повторяющиеся наборы, вам необходимо преобразовать их в frozenset() случаях:

unique_sets = {frozenset(s) for s in L} 

или если вы используете Python 3:

unique_sets = set(map(frozenset, L)) 

Если вам нужно закончить со списком измененных наборов снова вы можете создать список изобъектов еще раз с:

unique_set_list = [set(s) for s in unique_sets] 

Вы могли бы объединить два в одном списке понимание с небольшой потерей читаемости:

seen = set() 
unique_set_list = [ms for ms, ims in ((s, frozenset(s)) for s in L) 
        if not (ims in seen or seen.add(ims))] 
+0

Спасибо. Я отредактировал вопрос, чтобы сделать его более понятным. Есть ли способ использовать элементы 'unique_sets' в решении' frozenset() '? – DBS

+0

@ DBS: не совсем уверен, что вы имеете в виду? Вы можете использовать элементы 'frozenset()' объектов так же, как вы можете использовать обычные наборы. Вы просто не можете добавлять или удалять элементы из 'frozenset() 'так же, как вы не можете изменить содержимое кортежа. –

+0

@MartijnPieters Возможно, я не понимаю. Но предположим, что я беру 'z = frozenset ([1,2,2,3])'. Тогда как мне получить доступ к целочисленному элементу '1 в наборе z'? – DBS