改为使用frozenset
对象:
{frozenset(n[word]) for word in n if word in words}
集合中的对象必须是不可变的才能成为可散列的。set()
对象是可变的,但frozenset()
不是。他们对sset
是什么。tuple
list
如果您尝试创建所有集合的并集,则只需创建一个新的空集合并将生成器表达式传递给它:
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
来更快地做到这一点:
>>> 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])