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”的方法可以把我现在拥有的代码“splat”到一个新的集合中,而不是把所有的东西都转换成一个冻结集,然后再把它展平?在
编辑:2014-02-04 00:41:00
我做了一些修改,现在我想到了这个:
^{pr2}$但是我有一个新的错误信息
TypeError: union() argument after * must be a sequence, not generator
谷歌搜索并不能很好地解释这种情况。知道怎么回事吗?在
你在试着做一套。这行不通,因为集合不是散列类型,因为它是可变的,集合只能包含散列类型。这是因为Python使用集合中项目的哈希来快速检查成员资格。在
{cd1>你可以使用^ cda}。否则,请尝试一个
list
。在谢谢大家的帮助。我很快就会接受答复。只是想解释一下我遇到的另一个问题。Apparently我看到的
TypeError
错误是一个bug。经过仔细观察,我试图用字典中不存在的给定键对NoneType进行迭代。我将默认值设置为set([])
,现在一切都按预期运行。最后我没有带着冷冻套装去,但谢谢你的解释!我很困惑。在您正在尝试递归地构建
set
的set
。这是不允许的,因为set
是unhashable
,因此不能放在set
中。您可以使用frozenset
,因为它们是可散列的。在set
是无序的,这正是因为它们是按其成员的哈希在内部排序的。这允许快速查找集合成员。在阅读sets和{a2}的文档
相关问题 更多 >
编程相关推荐