2017-05-01 6 views
1

私は位置を持つセットを作成する必要があります。しかし、いくつかのポジションは値Noneを持つことができます(プレーボードに属さない場合)。どのように私は私のセットからこれらを削除することができます。それとも、私は手でそれをセットに追加する必要はないと判断できるのですか? (追加されたすべての要素は、自分のコードで異なる関数から得られた位置です)。これまでの私のコード(削除ステートメントのdoes't作業:。!KeyError例外なし事前にセットから値Noneを持つ変数を削除するにはどうすればよいですか?

collection = set() 
collection.add((above,below,left,right,top_left,top_right,bottom_left,bottom_right)) 
if above == None: 
    collection.remove(above) 
    return collection 

おかげ

+3

'filter'関数を調べるか、または理解でフィルタリングします。 – Carcigenicate

+1

その操作は、セットに単一のタプルを追加しますか?それは意図ですか? – tdelaney

+0

@Carcigenicateいいえ、なぜですか?これにより線形のパフォーマンスが保証され、OPがセットを必要とする場合は、フィルタオブジェクトを再度セットにマテリアライズする必要があります。あなたは、セット操作を使用する場合、平均的な一定のパフォーマンスのためにそれを取引しています。 –

答えて

3
collection = set() 
collection.add('a') 
collection.add(None) 
collection 
Out[501]: {None, 'a'} 
#you can use the set minus operator to remove None 
collection - set([None]) 
Out[502]: {'a'} 
3

set.addセットに単一の要素が追加されますあなたは、単一の追加あなたのケースでは。セットのすべての値を持つtupletuple内のアイテムのいずれかがNoneであればそれは問題ではありません。あなたが代わりにset.updateを使用する必要があります。そして、あなたはそれを削除することができ、いくつかの方法がある。

collection = set() 
collection.update((above,below,left,right,top_left,top_right,bottom_left,bottom_right)) 
collection.discard(None) 
+0

@ juanpa.arrivillaga - 'difference_update'はセットまたはシーケンスを必要とします。しかし、 'collection.discard(None)'は動作します。チェックは簡単ですが、 'discard'はそのタスクのために意図されているので、私はそれを変更します。 – tdelaney

+1

はい、 '.discard'は行く方法のようです。 'collection.difference_update((None、))' –

+0

これはまさに私が探していたものです!どうもありがとうございます! – Lintexed

関連する問題