如何在Sage中找到给定Set的子集?

时间:2012-04-29 09:13:57

标签: set subset sage

我的代码如下:

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'

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

1 个答案:

答案 0 :(得分:1)

CartesianProduct返回列表列表,例如:

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

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

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最多的。)