2014-02-03 2 views
0
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', но проблемы с этим я не вижу.Понимание концептуализации


Edit: 2014-02-03 15:25:00

Спасибо за объяснения всех. В этом есть смысл. Есть ли «питонический» способ взять код, который у меня есть, и «спланировать» содержимое набора в новый набор, а не преобразовывать все в фризонсет, а затем сгладить его?


Edit: 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 не слишком точно объяснил ситуацию. Знаешь, что происходит?

ответ

4

Вы пытаетесь построить set из set s, рекурсивно. Это недопустимо, потому что set s являются unhashable и поэтому не могут быть размещены в set. Вы можете использовать frozenset, потому что они являются hashable.

try: 
    states = frozenset({nfa_eclosure(M, x+1) for x in xrange(len(M[s])) if M[s].get('')}) 
except IndexError: 
    states = frozenset([]) 

set s неупорядоченны, именно потому, что они упорядочены внутренне хэша их членов. Это позволяет быстро находить элементы набора.

Читайте на документы для sets и hashable

+0

Почему не замороженные наборы? – Hyperboreus

+0

О! благодаря! отредактированный – mhlester

1

Вы пытаетесь сделать набор множеств. Это не сработает, потому что набор не является хешируемым типом, поскольку он изменен, а наборы могут содержать только хешируемые типы. Это связано с тем, что Python использует хэши элементов в наборе, чтобы быстро проверить членство.

Вместо этого вы можете использовать frozenset. В противном случае попробуйте list.

0

Спасибо за помощь всем. Я скоро приму ответ. Просто хотел объяснить другой вопрос, который у меня был. Apparently Ошибка, которую я наблюдал с TypeError, была ошибкой. При ближайшем рассмотрении я пытался выполнить итерацию NoneType, поскольку данный ключ не существовал для словаря. Я установил значение по умолчанию set([]), и теперь все работает так, как ожидалось. Не закончил с замороженным набором, но спасибо, что объяснил это! Я был так смущен.