python理解和集合。收到错误

时间:2013-07-05 13:59:45

标签: python

我有这个python代码:{n[word] for word in n if word in words}

但是我收到以下错误:TypeError: unhashable type: 'set'。这是因为n[word]返回了一组。但是,我不确定如何修复此代码。我知道一个简单的for循环可以解决它。

示例数据:

n = {'corporal': {35}, 'moral': {34}, 'purpose': {33, 34, 14, 49}, 'simulations': {42}, 'consultant': {16, 40, 38}, 'Indies': {3}, 'murdered': {10}}
words = ['moral', 'Indies'] 

预期产量:

{34, 3}

1 个答案:

答案 0 :(得分:3)

改为使用frozenset个对象:

{frozenset(n[word]) for word in n if word in words}

集合中的对象需要是不可变的以便可以删除。 set()个对象是可变的,但frozenset()不是。它们settuplelist的所有内容。

如果你试图创建所有集合的 union ,那么只需创建一个新的空集并将生成器表达式传递给它:

set().union(*(n[word] for word in n if word in words))

这将使用所有匹配集的并集来构建一个

演示您的测试输入:

>>> n = {'corporal': {35}, 'moral': {34}, 'purpose': {33, 34, 14, 49}, 'simulations': {42}, 'consultant': {16, 40, 38}, 'Indies': {3}, 'murdered': {10}}
>>> words = ['moral', 'Indies'] 
>>> {frozenset(n[word]) for word in n if word in words}
set([frozenset([34]), frozenset([3])])
>>> set().union(*(n[word] for word in n if word in words))
set([34, 3])

由于n是字典,因此您可以使用dictionary view objects更快地完成此操作:

>>> set().union(*(n[k] for k in n.viewkeys() & words))
set([34, 3])

或者如果您使用的是Python 3,.keys()默认返回视图对象:

>>> set().union(*(n[k] for k in n.keys() & words))
set([34, 3])