2012-02-15 23 views
34

私はここで間違っていますか?セット番号を追加

a = set().add(1) 
print a # Prints `None` 

空のセットに番号1を追加しようとしています。

+2

@CharlesB答えを出す場合は、答えで行う必要があります。セミコロンを使用するのは恐ろしいことです。 Pythonは読み込み可能であることを意図しており、複数の文を1行にまとめることは、読みやすさにとって非常に悪いことです。 –

+0

@GarethLatty:彼は質問にも答えていません。 – user443854

答えて

53

Pythonでは、シーケンスを変更するメソッドがNoneを返すという規則があります。

は考えてみましょう:

>>> a_list = [3, 2, 1] 
>>> print a_list.sort() 
None 
>>> a_list 
[1, 2, 3] 

>>> a_dict = {} 
>>> print a_dict.__setitem__('a', 1) 
None 
>>> a_dict 
{'a': 1} 

>>> a_set = set() 
>>> print a_set.add(1) 
None 
>>> a_set 
set([1]) 

がいくつかは、この大会 "Pythonで恐ろしいmisdesign" が、(リストに関して)設計し、この設計上の決定の背後にある歴史よくある質問gives the reasoningを考慮することができますなぜlist.sort()ソートされたリストを返しますか?

パフォーマンスの問題が発生した場合は、リストのコピーを並べ替えるだけで無駄になります。したがって、list.sort()は、 リストを所定の場所にソートします。その事実を思い出させるために、ソートされたリスト を返しません。この方法では、ソートされたコピーが必要なときに偶発的に のリストを上書きするだけでなく、 を未分類のバージョンに保つ必要があります。

Python 2.4では、新しい組み込み関数 - sorted() - が追加されました。 この関数は、指定されたイテラブルから新しいリストを作成し、 をソートして返します。

この機能の特有の問題は、言語の誤った設計ではなく、セットを作成するための良い方法の誤解が原因です。 Latitudeware points outとして、Python 2.7以降では、リテラルa = {1}またはa = set([1])をSven Marnachのanswerとして使用することができます。

私は、オブジェクトを変更するメソッドの後に感嘆符を置くRubyの規則を好きですが、私はPythonのアプローチを受け入れることができます。比較的単純でそれを行うには

4

add()のでNone返す場所にセットし・修正されています

>>> empty = set() 
>>> print(empty.add(1)) 
None 
>>> empty 
set([1]) 
1

あなたはこれを行う必要があります:あなたはaに追加1の結果を代入している

a = set() 
a.add(1) 
print a 

お知らせを、 Pythonで定義されているadd操作はNoneを返します。これがに割り当てられますあなたのコードの3210。

また、あなたはセットを初期化するためにこれを行うことができます。

a = set([1, 2, 3]) 
24

add()方法は、セットに要素を追加しますが、それは再びセットを返さない - それはNoneを返します。

a = set() 
a.add(1) 

またはより良い

a = set([1]) 

が働くだろう。

+1

ありがとうございます。それはPythonのひどい誤ったデザインのようです。どう思いますか? – Randomblue

+8

@Randomblue: 'set.add()'が再びセットを返すと全く混乱していたと思います。それはなぜでしょうか?コンベンションは次のようなものです。オブジェクトが定位置に変更された場合、 'None'を返します。新しいオブジェクトを作成する場合は、新しいオブジェクトを返します。それはちょうどそれがされている方法です。 –

+0

@RandomBlue:あなたのフォローアップの質問に答える答えを作成しました。 –

1

addメソッドはセットを更新しますが、Noneを返します。

a = set() 
a.add(1) 
print a 
1

返される値は、set().add(1)に割り当てられます。この値はNoneです。add()は値を返しません。その代わりに、リストのインプレースで動作します。あなたがやりたいこと

は、このでした:もちろん

a = set() 
a.add(1) 
print(a) 

、この例では簡単ですが、Pythonはセットリテラルをサポートしていますので、あなたが本当にこれをやってみたかったならば、それは何をする方が良いでしょう。

警告されるが
a = {1} 
print(a) 

中括弧は{}が空のdict、中括弧ではないがdictsとセットの両方のために使用されるという事実による空集合(辞書は、コロンの使用によって分離されているを示し、(集合を表しますキーと値を区切る)

1

もう一つの方法は、次のようになります。

a = set() 
a = set() | {1} 

これはあなたの集合Aと要素として1とセット

プリント(a)の利回り{1間の結合を作成します}とすると、aはaと{1}の両方の要素をすべて持つことになるため、

0

a = set()| {1} "インプレース"演算子を検討してください:

a = set() 
a |= {1} 
関連する問題