python 理解和集合。接收错误

标签 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}

最佳答案

使用frozenset对象代替:

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

集合中的对象必须是不可变的才能可散列。 set() 对象是可变的,但 frozenset() 则不然。它们的作用是设置,就像元组列表一样。

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

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() 默认返回一个 View 对象:

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

关于python 理解和集合。接收错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17490686/

相关文章:

python - 选择要从 Excel 读入 pandas 数据框的行号

python - 打印曲线拟合功能

python - 在多个轮廓CV2上拟合边界椭圆

python - SQLalchemy 并发连接速度慢

python - 通过 API 调用报告滥用 YT channel

python - Selenium 超时异常: Message: python

java - 通过 Excel 与 Python/Java/其他编程语言访问 Bloomberg 的 API

python - 任务失败,因为返回代码为 -1,而预期为 0 - Bamboo

python - 使用Python获取硬盘温度

python - lxml - 具有多个命名空间的 XML 文档