2017-02-09 3 views
2

を設定し、これは私が今実際にPythonのマージは、私はセットで定義されたセットをマージしようとしています

a = frozenset([1,3,4]) 
b = frozenset([1,2,3,4,5]) 
s = set() 
s.add(a) 
s.add(b) 
merged = set(itertools.chain.from_iterable(s)) 

sは多くのfrozenset型を含むことが持っているものです。それを行う良い方法はありますか? reduceのように感じますが、

merged = reduce(|, s) 

は動作しません。

また

merged = reduce(set.add, s) 

sの要素がfrozenset型であるため、動作しません。

+2

を '|スタンドアロン機能が['演算子として知られているように '。 or_'](https://docs.python.org/3/library/operator.html#mapping-operators-to-functions) –

答えて

3

あなたが二つ以上のfrozenset型を持っている場合は、それらのコンテナ(例えば、リスト)を作成し、組合適用されます。

listoffrozensets = [a,b,...] 
frozenset().union(*listoffrozensets) 
+2

違いはありませんが、実際には直接*メソッドを使用します'frozenset.union' –

+1

@ juanpa.arrivillagaしかしもちろんです。 – DyZ

+1

これはこれを「正しい」方法と言います。 'reduce'はおそらく効率が悪いでしょう。とにかく、Pythonでは、 'reduce'は勧められません。これがpython 3の 'built-ins'名前空間から削除された理由です。 –

3

あなた使用を減らすことができ、ちょうど適切な関数を使用します。

>>> frozenset.union 
<method 'union' of 'frozenset' objects> 
>>> reduce(frozenset.union, [a,b]) 
frozenset({1, 2, 3, 4, 5}) 
>>> 

をあなたは|と右のトラックにあったが、|は、Pythonでの演算子であり、そして機能に代入することはできません。しかし、それをしたいときは、演算子をインポートしてください!

>>> import operator 
>>> reduce(operator.or_, [a,b]) 
frozenset({1, 2, 3, 4, 5}) 
関連する問題