1

我的代码如下所示:

def Z(m,n):
    return CartesianProduct(IntegerRange(m),IntegerRange(n))

for v in Subsets(Z(2,2)):
    print v

但是,当我尝试运行它时,出现以下错误:

Traceback (most recent call last):
  File "x.py", line 13, in <module>
    for v in Subsets(Z(_sage_const_2 ,_sage_const_2 )):
  File "/opt/sage-4.8-linux-64bit-ubuntu_10.04.3_lts-x86_64-Linux/local/lib/python2.6/site-packages/sage/combinat/subset.py", line 234, in __iter__
    lset = __builtin__.list(self.s)
  File "/opt/sage-4.8-linux-64bit-ubuntu_10.04.3_lts-x86_64-Linux/local/lib/python2.6/site-packages/sage/sets/set.py", line 650, in __iter__
    for x in self.set():
  File "/opt/sage-4.8-linux-64bit-ubuntu_10.04.3_lts-x86_64-Linux/local/lib/python2.6/site-packages/sage/sets/set.py", line 719, in set
    return set(self.object())
TypeError: unhashable type: 'list'

获取任意集合的所有子集的集合的规范方法是什么?

4

1 回答 1

1

CartesianProduct返回列表列表,例如:

>>> print list(Z(2,2))
[[0, 0], [0, 1], [1, 0], [1, 1]]

但是Subsets无法处理列表中的元素(它在set内部将其参数转换为 a,并且 Python 中的集合被实现为哈希集,因此出现关于“unhashibility”的错误)。要解决此问题,您应该将内部列表转换为元组:

for v in Subsets(tuple(l) for l in Z(2,2)):
    print v

请注意,这是使用生成器表达式(而不是列表推导式)来避免构造中间列表。

(也可以使用map(tuple, Z(2,2))import itertools iterools.imap(tuple, Z(2,2))代替生成器表达式,但上面给出的解决方案是最 Pythonic 的。)

于 2012-04-29T10:26:59.740 回答