首页 > 解决方案 > 集合(数组中的单个对象)返回集合(字符串)

问题描述

见第 1 部分: http: //artificial-intelligence-class.org/homeworks/hw4/homework4.html

我试图为我的作业中的一个答案返回一个集合(数组),但我只是返回一个集合(字符串),所以它说我的答案不正确。这只发生在我要转换的数组的长度为 1 时。这很烦人,因为稍后我会在两个数组之间设置差异并且它不会编译,因为这两个数组的类型不同。这是我的代码:

    def get_values(self, cell):
        if cell in self.board:
            value = [self.board[cell]]
            return set([tuple(value)])
        else:
            values = (1,2,3,4,5,6,7,8,9)
            return set([values])

执行

b = read_board("sudoku/hw7-medium1.txt")
print(Sudoku(b).get_values((0, 1)))

{'1'} 应该返回时 返回 {[1]}

标签: python

解决方案


set() 是 set 对象的构造函数。

它接收一个可迭代的作为参数。 Iterable是要转换成集合的序列(字符串、元组等)或集合(集合、字典等)或迭代器对象。

这意味着,如果您将数组、元组等作为单个参数传递给 set,它只会创建它包含的一组元素。

此外,集合不可能包含列表作为元素

a = (1,2,[3,4])

会给你一个错误,说列表不是可散列的对象。

但是,可以完成您尝试做的事情:

   a = set(
          ((1,2,3),)  # this is a tuple, whose 1st element is a tuple
          )

现在包含

{(1, 2, 3)}

仍然没有实际的列表:

>>> a = set( ([1,2,3],) )
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unhashable type: 'list'

列表存在问题的原因是它们是动态的。您可以更改列表的元素 - 但元组是不变的。您不想构建一个哈希值,它的密钥可以在您不知情的情况下更改。


推荐阅读