web-dev-qa-db-ja.com

「return list.sort()」がリストではなくNoneを返すのはなぜですか?

findUniqueWordsがソートされたlistになることを確認できました。ただし、return the listではないのはなぜですか?

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
117
Lee_Str

list.sortはリストを所定の位置にソートします。つまり、新しいリストを返しません。書くだけ

newList.sort()
return newList
140
Ismail Badawi

問題はここにあります:

answer = newList.sort()

sortは、ソートされたリストを返しません。むしろ、リストを所定の位置に並べ替えます。

つかいます:

answer = sorted(newList)
116
NPE

こちら は、Pythonの開発者リストにあるGuido van Rossumからのメールです。オブジェクトに影響を与え、新しいものを返さない操作でselfを返さない理由を説明しています。

これは、単一のオブジェクトに対する一連の副作用を次のように連鎖させることができるコーディングスタイル(他のさまざまな言語で人気があり、特にLISPがおもしろいと思います)に由来します。

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

これは同じだろう

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

連鎖は読みやすさに対する脅威だと思います。読者が各方法に精通している必要があります。 2番目の形式は、これらの各呼び出しが同じオブジェクトに作用することを明確にしているので、クラスとそのメソッドをよく知らなくても、2番目と3番目の呼び出しがxに適用されることを理解できます(そしてすべての呼び出しは副作用のために行われます)、他の呼び出しではありません。

文字列処理操作など、新しい値を返す操作のチェーンを予約します。

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

Pythonには、ソートmethod(または「メンバー関数」)とソートfunctionの2種類のソートがあります。 sortメソッドは、という名前のオブジェクトの内容を操作します-それを考えるオブジェクトがそれ自体を再配列するために取っているアクション。ソート関数はオブジェクトによって表されるデータに対する操作であり、ソートされた順序で同じ内容の新しいオブジェクトを返します。

lという名前の整数のリストを指定すると、l.sort()を呼び出すと、リスト自体の順序が変更されます。

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

このメソッドには戻り値がありません。しかし、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]

返される値はnot a deep copy であるため、通常どおりリスト内に含まれる要素に対する副作用のある操作には注意してください。

>>> 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]]
13
zxq9

Pythonは、list.sortlist.appendrandom.shuffleなどのデータを変更する関数とメソッドからNoneを習慣的に返​​します。変異していた。

反復可能を取り、そのアイテムの新しいソート済みリストを返す場合は、sorted組み込み関数を使用します。

12
Mike Graham

リストを返さない理由を理解するには:

sort()はwhile値を返しません。

Sort()メソッドは、特定のリストの要素を特定の順序(値を返さずに昇順または降順)で並べ替えるだけです。

そのため、問題はanswer = newList.sort()にあり、答えはありません。

代わりにreturn newList.sort()を行うことができます

Sort()メソッドの構文は次のとおりです。

list.sort(key=..., reverse=...)

または、同じ目的でPythonの組み込み関数sort()を使用することもできます。

sorted(list, key=..., reverse=...)

注:sort()とsort()の最も単純な違いは、sort()は値を返さない一方で、sorted()は反復可能なリストを返すことです。

あなたの場合answer = sorted(newList)

3
Projesh Bhoumik