Концептуализация понимания множества
def nfa_eclosure(M, s):
"""
>>> M = [{'':{1,2,3}}, {'b':{1}}, {'a':{2}}]
>>> nfa_eclosure(M, 0)
set([0, 1, 2, 3])
"""
try:
states = {nfa_eclosure(M, x+1) for x in xrange(len(M[s])) if M[s].get('')}
except IndexError:
states = set([])
states.add(s)
return states
Запуск этого броска TypeError: unhashable type: 'set'
но я не вижу проблемы.
Редактировать: 2014-02-03 15:25:00
Спасибо всем за объяснения. В этом есть смысл. Есть ли "питонный" способ взять код, который у меня есть сейчас, и "разделить" содержимое набора на новый набор, вместо того, чтобы преобразовать все в морозильное устройство и затем сгладить его?
Изменить: 2014-02-04 00:41:00
Я сделал некоторые изменения, и теперь я придумал это:
try:
return set([s]).union(*(nfa_eclosure(M, x) for x in M[s].get('')))
except IndexError:
return set([s])
но у меня новое сообщение об ошибке
TypeError: union() argument after * must be a sequence, not generator
Поиск в Google не совсем точно объяснил ситуацию. Знаете, что происходит?
3 ответа
Вы пытаетесь построить set
из set
с, рекурсивно. Это запрещено, потому что set
с unhashable
и поэтому не может быть помещен в set
, Вы можете использовать frozenset
потому что они моющиеся
try:
states = frozenset({nfa_eclosure(M, x+1) for x in xrange(len(M[s])) if M[s].get('')})
except IndexError:
states = frozenset([])
set
Они неупорядочены, именно потому, что они упорядочены внутри хешем их членов. Это позволяет быстро искать членов набора.
Вы пытаетесь сделать набор наборов. Это не сработает, потому что набор не является типом hashable, так как он изменчив, и наборы могут содержать только типы hashable. Это связано с тем, что Python использует хэши элементов в наборе для быстрой проверки членства.
Вы могли бы использовать frozenset
вместо. В противном случае попробуйте list
,
Спасибо всем за помощь. Я скоро приму ответ. Просто хотел объяснить другой вопрос, который у меня был. Видимо ошибка, которую я видел с TypeError
была ошибка При ближайшем рассмотрении я пытался перебрать NoneType с указанным ключом, не существующим для словаря. Я установил значение по умолчанию set([])
и теперь все работает как положено. Не закончил тем, что пошел с замороженным набором, но спасибо за объяснение этого! Я был так смущен.