【问题标题】:Set initialization using a list - two different approaches and one does not work [duplicate]使用列表设置初始化-两种不同的方法,一种不起作用[重复]
【发布时间】:2020-05-02 04:32:47
【问题描述】:

当我尝试使用以下语句初始化集合时:

myset = {['ki','ni']}

我收到以下错误:

TypeError: unhashable type: 'list'

但是,我可以使用 set() 函数使用相同的列表初始化集合,如下所示:

myset = set(['ki','ni'])

我知道集合的元素必须是不可变的,因此我在第一种情况下指定的错误可能就是由于这个原因。令人困惑的是,为什么这在使用 set() 函数时有效,而不是在使用花括号 ({}) 大括号直接初始化集合时有效?

【问题讨论】:

  • 您的第二个代码相当于{*['ki', 'ni']}。它看起来像{'ki', 'ni'}{*['ki','ni']} == set(['ki','ni']) 计算结果为 True。注意,输出是{'ki', 'ni'} 而不是{['ki', 'ni']}

标签: python python-3.x


【解决方案1】:

{['ki','ni']} 表示包含一个元素 ['ki','ni'] 的集合。这不是集合的有效元素,因此您会收到错误消息。

set(iterable) 表示包含iterable 中所有项目的集合,即使用 for 循环遍历 iterable 会得到什么。在这种情况下,它的计算结果为 {'ki','ni'},一个包含两个字符串的集合。

【讨论】:

    【解决方案2】:

    因为你的两个代码 sn-ps 做了两个不同的事情。

    第一个{['ki','ni']} 尝试将列表本身添加到集合中;正如您还观察到的那样,由于列表不可散列,因此失败了。

    第二个 set(['ki','ni']) 成功,因为它将列表转换为集合,也就是将列表的元素添加到集合中。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-20
      • 1970-01-01
      • 2012-11-25
      • 1970-01-01
      • 2020-12-06
      • 1970-01-01
      相关资源
      最近更新 更多