2011-09-04 9 views
64

私はfindUniqueWordsの結果がソートされたことを確認できましたlist。しかし、それはreturnlist、なぜですか?なぜ "return list.sort()"がリストを返さないのですか?

def findUniqueWords(theList): 
    newList = [] 
    words = [] 
    # Read a line at a time 
    for item in theList: 
     # Remove any punctuation from the line 
     cleaned = cleanUp(item) 
     # Split the line into separate words 
     words = cleaned.split() 
     # Evaluate each word 
     for word in words: 
      # Count each unique word 
      if word not in newList: 
       newList.append(word)  
    answer = newList.sort() 
    return answer 
+0

I thをしていませんインクを使用すると、アイテムを何度も文字列に変換する必要があります。通常は一度は十分ですし、cleanUpの入力でもそれを行うのがよりクリーンです。 – Ben

+0

ちょっとばかげた考えですが、ユニークなアイテムのリストが必要な場合は、セットに変換してみませんか?必要に応じてリストに戻すことができます。 'theSet =セット(theList)' そして、あなたが行われているが、あなただけ戻っリストにキャストする必要があります。 'theList =リスト(theSet)完了' 。簡単です。 – runlevel0

答えて

78

list.sortは、リストを所定の場所に並べ替えます。つまり、新しいリストを返しません。ただ、問題はここにある

newList.sort() 
return newList 
+0

'return sorted(newList)'が短いです。変数はローカルなのでここでは関係ありませんが、インプレースソートではシェア変数が変更されることがあります。 –

-6

戻り値を中心に、Python sort関数のドキュメントをお読みください。

+11

-1。質問を読んでください。彼は「なぜ?」と尋ねた。 Python開発者にはおそらく理由があります。ドキュメンテーションには、機能の設計選択の動機付けはなく、機能の動作のみが含まれています。 – Tarrasch

75

を書く:

answer = newList.sort() 

sortソートされたリストを返しません。むしろ、リストを適切な場所に並べ替えます。

用途:

answer = sorted(newList) 
10

Pythonは習慣的アイデアは、それが変異していることにヒントということで、機能やデータを変異させる方法からNone、などlist.sortlist.append、およびrandom.shuffleを返します。

iterableを使用してアイテムのソートされた新しいリストを返す場合は、sorted組み込み関数を使用してください。

44

Hereは、Guido van Rossumからの電子メールです。なぜなら、彼はなぜオブジェクトに影響する操作にselfを返さないことを選択し、新しいオブジェクトを返さないのですか?

x.compress().chop(y).sort(z) 
:単一のオブジェクトへの副作用のシリーズ は次のように連鎖させることができます。これは、コーディングスタイルから来て

(人気のある様々な他の言語で、私はそれで特にLispの凝るを信じ )私はチェーンが読みやすさへの脅威を形成見つけ

x.compress() 
    x.chop(y) 
    x.sort(z) 

と同じになり

。読者はそれぞれの方法に精通している必要があります。 の2番目の形式は、これらの呼び出しが同じ オブジェクトで動作することを明確にしています。そのため、クラスとそのメソッドがわからなくても、 の場合は、2番目と3番目の呼び出しが x(すべての呼び出しは副作用のために作られています)、 にはありません。ソート方法(または「メンバ関数:

y = x.rstrip("\n").split(":").lower() 
+17

'split(": ")" lower() 'は、' split'が 'lower'メソッドを持たないリストを返すので、不正なチェーンです。 – SuperBiasedMan

7

Pythonは一種の二種類があります。

私は、文字列処理操作と同様に、新しい値を返す 操作に連鎖を予約したいのですが")、ソートです。sortメソッドは、という名前のオブジェクトの内容に対して、オブジェクトが自分自身を並べ替えるために取っているアクションという名前のオブジェクトの内容に作用します。ソート機能はオブジェクトによって表されるデータに対してオペレーションであり、同じ内容の新しいオブジェクトをソートされた順序で返します。

>>> l = [1, 5, 2341, 467, 213, 123] 
>>> l.sort() 
>>> l 
[1, 5, 123, 213, 467, 2341] 

このメソッドは戻り値はありません。私たちはl.sort()を呼び出す場合という名前の整数のリストlリスト自体を考えると

が並べ替えされます。しかし、l.sort()の結果を割り当てようとするとどうなりますか?

>>> l = [1, 5, 2341, 467, 213, 123] 
>>> r = l.sort() 
>>> print(r) 
None 

rは実際には何もありません。これは、プログラマーがPythonからの不在期間の後に忘れる可能性がある、奇妙で、いくらか厄介な細部の1つです(これが私がこれを書いている理由ですので、I再び忘れないでください)。

機能sorted()は、他の一方で、lの内容に何もしませんが、新しいが返されます、lと同じ内容でリストを並べ替え:

>>> l = [1, 5, 2341, 467, 213, 123] 
>>> r = sorted(l) 
>>> l 
[1, 5, 2341, 467, 213, 123] 
>>> r 
[1, 5, 123, 213, 467, 2341] 

が返されることに注意してください値がないdeep copyので、いつものように、リスト内に含まれる要素をオーバー側-effecty操作に関する注意が必要:

>>> spam = [8, 2, 4, 7] 
>>> eggs = [3, 1, 4, 5] 
>>> l = [spam, eggs] 
>>> r = sorted(l) 
>>> l 
[[8, 2, 4, 7], [3, 1, 4, 5]] 
>>> r 
[[3, 1, 4, 5], [8, 2, 4, 7]] 
>>> spam.sort() 
>>> eggs.sort() 
>>> l 
[[2, 4, 7, 8], [1, 3, 4, 5]] 
>>> r 
[[1, 3, 4, 5], [2, 4, 7, 8]] 
関連する問題