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内部的に に変換し、Python のセットはハッシュ セットとして実装されるため、「非ハッシュ化」に関するエラーが発生します)。これを修正するには、内部リストをタプルに変換する必要があります。

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

これは、中間リストの作成を避けるために (リスト内包表記ではなく) ジェネレーター式を使用していることに注意してください。

(ジェネレーター式の代わりにmap(tuple, Z(2,2))orを使用することもできますが、上記の解決策は最も Pythonic です。)import itertools iterools.imap(tuple, Z(2,2))

于 2012-04-29T10:26:59.740 に答える