Концептуализация понимания множества

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

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

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

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