【问题标题】:How do I resolve "Unhashable Type" when using sets?使用集合时如何解决“不可散列的类型”?
【发布时间】:2022-01-04 09:16:16
【问题描述】:

我将我的 Maya 工具从 python2 移植到 python3 并遇到了一个问题,我一直在使用 set() 删除列表中的重复条目。以前这很好用,但现在我得到了:

TypeError: unhashable type: 'MeshUV'

列表包含 pymel MeshUV 对象,可能如下所示:

[MeshUV('Right_Hand.map[1011]'), MeshUV('Right_Hand.map[1012]'),
 MeshUV('Right_Hand.map[1013]'), MeshUV('Right_Hand.map[1014]')]

Klaus D 要求使用最少的代码来得到这个错误,所以在 Maya 中使用它并选择一些 uvs。

import pymel.core as pm
uvs = pm.ls(sl=True, fl=True)
set(uvs)

我不知道为什么这突然成为一个问题,但也许有任何快速的替代方法可以使用 set 删除重复项,或者我是否可以以某种方式更改列表以使其再次工作?

编辑:所以在 martineau 的回应之后,我认为这是 Maya 2022 的变化,而不是 python3 本身,即使这是他们进行切换时的 Maya 版本。

【问题讨论】:

  • 请创建一个可重现的最小示例并向我们展示完整的错误回溯!
  • MeshUV 显然不是hashable
  • 在 Python 2 和 3 之间没有任何改变会影响这一点,即它在 Python 2 中也不会工作——还有其他问题。
  • 详细信息也会有所帮助:你说它在 Python 2 中工作,但在同一版本的 Maya 或其他版本的 Maya 下?尝试使用 -pythonver 2 命令行参数运行相同的 Maya,看看它是否有效。

标签: python set maya


【解决方案1】:

Python 要求集合或字典中的项目是可散列的。如果您没有使用可以定义 __eq____hash__ 函数的自定义类型,则最好使用不同的删除重复项的方法:

new_list = list()
for item in old_list:
    if item not in new_list:
        new_list.append(item)

【讨论】:

  • 实际上 Python 只需要字典的 可以散列,与每个键关联的值不必是。
  • 很高兴知道!感谢您的信息:)
猜你喜欢
  • 2021-01-28
  • 1970-01-01
  • 1970-01-01
  • 2022-06-11
  • 2018-06-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-22
相关资源
最近更新 更多