概念化集合理解

2024-04-19 23:39:59 发布

您现在位置:Python中文网/ 问答频道 /正文

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

谷歌搜索并不能很好地解释这种情况。知道怎么回事吗?在


Tags: in编辑forgetlenifdeftry
3条回答

你在试着做一套。这行不通,因为集合不是散列类型,因为它是可变的,集合只能包含散列类型。这是因为Python使用集合中项目的哈希来快速检查成员资格。在

{cd1>你可以使用^ cda}。否则,请尝试一个list。在

谢谢大家的帮助。我很快就会接受答复。只是想解释一下我遇到的另一个问题。Apparently我看到的TypeError错误是一个bug。经过仔细观察,我试图用字典中不存在的给定键对NoneType进行迭代。我将默认值设置为set([]),现在一切都按预期运行。最后我没有带着冷冻套装去,但谢谢你的解释!我很困惑。在

您正在尝试递归地构建setset。这是不允许的,因为setunhashable,因此不能放在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是无序的,这正是因为它们是按其成员的哈希在内部排序的。这允许快速查找集合成员。在

阅读sets和{a2}的文档

相关问题 更多 >