【问题标题】:Conceptualizing set comprehension概念化集合理解
【发布时间】:2014-02-03 20:00:02
【问题描述】:
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

谷歌搜索并不能很好地解释这种情况。知道发生了什么吗?

【问题讨论】:

    标签: python dictionary set set-comprehension


    【解决方案1】:

    您正在尝试以递归方式构建sets 的set。这是不允许的,因为sets 是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([])
    

    sets 是无序的,正是因为它们在内部按其成员的哈希值排序。这允许快速查找集合成员。

    阅读setshashable 的文档

    【讨论】:

      【解决方案2】:

      您正在尝试制作一组​​集合。这是行不通的,因为集合不是可散列类型,因为它是可变的,并且集合只能包含可散列类型。这是因为 Python 使用集合中项目的哈希值来快速检查成员资格。

      您也许可以改用frozenset。如果失败,请尝试list

      【讨论】:

        【解决方案3】:

        感谢大家的帮助。我很快就会接受答案。只是想解释我遇到的另一个问题。 Apparently 我看到的 TypeError 错误是一个错误。经过仔细检查,我试图用字典不存在给定键来迭代 NoneType 。我将默认设置为set([]),现在一切都按预期运行。最终没有选择冷冻套装,但感谢您的解释!我很困惑。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-06-25
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多