2013-08-29 86 views
1

爲什麼不能使用子集運算符< =?來比較集合和ImmutableSet?例如。運行以下代碼。這裏有什麼問題?任何幫助讚賞。我正在使用Python 2.7。爲什麼我不能比較Python 2.7中的集合和immutableset

>>> from sets import ImmutableSet 
>>> X = ImmutableSet([1,2,3]) 
>>> X <= set([1,2,3,4]) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/sets.py", line 291, in issubset 
    self._binary_sanity_check(other) 
    File "/opt/local/Library/Frameworks/Python.framework/Versions/2.7/lib/python2.7/sets.py", line 328, in _binary_sanity_check 
    raise TypeError, "Binary operation only permitted between sets" 
TypeError: Binary operation only permitted between sets 
>>> 

回答

6

改爲使用frozenset object;該sets module已被棄用,不與內建類型可比:

>>> X = frozenset([1,2,3]) 
>>> X <= set([1,2,3,4]) 
True 

從爲sets模塊的文檔:

自2.6版本不推薦使用:內置set/frozenset類型更換這個模塊。

如果你被卡住使用sets模塊代碼,進行比較時堅持其類型獨家:

>>> from sets import Set, ImmutableSet 
>>> Set([1, 2, 3]) <= set([1, 2, 3, 4]) 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "/Users/mj/Development/Libraries/buildout.python/parts/opt/lib/python2.7/sets.py", line 291, in issubset 
    self._binary_sanity_check(other) 
    File "/Users/mj/Development/Libraries/buildout.python/parts/opt/lib/python2.7/sets.py", line 328, in _binary_sanity_check 
    raise TypeError, "Binary operation only permitted between sets" 
TypeError: Binary operation only permitted between sets 
>>> ImmutableSet([1, 2, 3]) <= Set([1, 2, 3, 4]) 
True 

的Python setfrozenset確實接受了許多操作符和函數的任何序列,所以反相測試也可以工作:

>>> X 
frozenset([1, 2, 3]) 
>>> set([1,2,3,4]) >= X 
True 

這同樣適用於.issubset()功能上sets.ImmutableSetsets.Set類:

>>> X.issubset(set([1,2,3,4])) 
True 

而不是混合過時的類型和新的內置插件完全是最好的選擇。

相關問題