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
谢谢大家的解释。这就说得通了。有没有一种“pythonic”的方式来获取我现在拥有的代码并将集合的内容“拼凑”到一个新的集合中,而不是将所有内容都转换为 freezeset 然后展平它?
编辑: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
谷歌搜索并不能很好地解释这种情况。知道发生了什么吗?