2017-10-13 6 views
0

奇妙なタイトルのために申し訳ありません、それをより良く説明する方法はわかりません(自由に編集できます)。Python:set1の各アイテムについて、値が1の他のアイテムを持つようにします

(効率的に)次の操作を実行する方法がわかりません。私は次の出力を取得したい、のは、私はセット{a,b,c}を持っているとしましょう:私はPythonでの関数があると思われるので、

{a: {b,c}} 
{b: {a,c}} 
{c: {a,b}} 

私はそうする方法を見つけましたが、私は(それが効率的/ニシキヘビではないと思います)そうするために:

set1 = {'a','b','c'} 
output = [] 
for item in set1: 
    temp_set = set1.copy() 
    temp_set.remove(item) 
    output.append({item: temp_set}) 
print(output) 

これが印刷されます:[{'b': {'c', 'a'}}, {'c': {'b', 'a'}}, {'a': {'b', 'c'}}]

+0

私はここに特に非効率的な何かを見つけることができません。おそらく、要素の削除を避けるために、ループ内の最初の2行を 'temp_set = {x for set1 in x in!x!= item} 'に置き換えてください。 – Amadan

答えて

4

はい、よりコンパクトな方法があります:set difference演算子を使用します。

set1 = {'a','b','c'} 
output = [{u: set1-{u}} for u in set1] 
print(output) 

出力

[{'c': {'a', 'b'}}, {'a': {'c', 'b'}}, {'b': {'c', 'a'}}] 

これを行うための他の関連方法はuなくセットから1つのアイテムのタプルを作ることです。メリットは、タプルはセットより簡単であり、構築はより速いということです。 OTOHでは、Pythonセットはかなり効率的ですが、ハッシュテーブルのオーバーヘッドがあります。

set1 = {'a','b','c'} 
output = [{u: set1.difference((u,))} for u in set1] 
print(output) 

このコードは、前のコードと同等の出力を示します。

set differenceメソッドを呼び出しても、実際にiterable argからセットを構築するわけではありませんが、単純に反復処理を行うだけです。

+0

コンパクト、おそらく;新しいセットをインスタンス化するだけで、それを減算することができます。恐らく超効率的ではありません。それでも、より良いプロフィール。 – Amadan

+0

@Amadanフェアポイント、セット工事はかなり安いですが。 set differenceのメソッド形式を使用すると、代わりにタプルを使って行うことができます。しかし、それは本当に多くの節約ではありません。 –

+0

@Amadan私はなぜ 'set1- {u} 'が減算する余分な組を作る必要があるのか​​わかりません。 – schwobaseggl

0

PM2Ringの設定差分アプローチは、細かく、最もコンパクトです。完全性のために、より一般的に適用可能であるため、例えば、あなたのdictの値がリスト、タプルや発電機になりたい場合は、以下の条件の理解に基づくバージョンが推奨されるべきである。

output = [{u: {x for x in set1 if x != u}} for u in set1] 
# output = [{u: [x for x in set1 if x != u]} for u in set1] 
# output = [{u: (x for x in set1 if x != u)} for u in set1] 
+0

私は内部セットの理解の中のPythonのループが、セットの差分の操作によって実行される内部のループよりかなり遅いと考えます。また、リストのような解けないものをセットに格納することはできないので、あまり一般的ではないという点はありません。 –

+0

@ PM2Ringパフォーマンスパートに同意します。しかし、値はハッシュ可能である必要はありません。私は私のポイントを説明するために2つの例を追加しました。 – schwobaseggl

+0

Dictの値は必ずハッシュ可能である必要はありませんが、dictのキーと設定された項目はそうです。 –

関連する問題