2012-04-29 6 views
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' 

すべてのセットを得るための標準的な方法は何ですか任意の集合の部分集合?

答えて

1

CartesianProductは例えば、リストのリストを返します。

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

しかしSubsetsは、(それが内部setにその引数を変換し、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))を使用することができるが、上記の解決策は、最もPython的である。)

関連する問題