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


154

findUniqueWords結果がソートされていることを確認できました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

アイテムを文字列に何度も変換する必要はないと思います。通常は十分であり、cleanUpへの入力でも同じように実行できます。
Ben

3
ばかげた考えですが、ユニークなアイテムのリストが必要な場合は、セットに変換してみませんか?その後、必要に応じてそれらをリストに戻すことができます。 theSet= set(theList) そして、あなたはそれをリストにキャストバックする必要があるだけです: theList = list(theSet) 完了。簡単です。
runlevel0 2018

1
@ runlevel0の発言に追加する(これは良い考えです):theSet' into a sorted list with ソート済み(theSet) `を変換できます。
Zaz

非常に不規則な言語
ニコラ

これはコアですが、問題/苛立たしい -言語の哲学的選択です。連鎖は一般に、Pythonでは孤立した概念です。
javadba

回答:


194

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

newList.sort()
return newList

18
return sorted(newList)短いです。変数はローカルなので、ここでは問題になりませんが、インプレースソートによって共有変数が変更される場合があります。
ジャン=フランソワ・ファーブル

エントリがリストに追加された場合a.append('x')、または最後にa.extend('x)チェーンできない場合も興味深いですsort()。2行に分割する必要があります。メソッドがリストを返すのであれば、もっと良かったでしょう! docs.python.org/3/tutorial/datastructures.html この同じメッセージは、まさにそれを行うことによって私を噛みました。結果として、2つの行に分割する必要があります。これは同じエラーを生成するため、後でリストで.sort() NOT を使用する必要がありsorted()ます l = ['1']; l = sorted(l.append('2'))(セミコロンを追加したので、カット/ペーストして実行できます)
JGFMK

これも一見の価値があるかもしれません。grantjenks.com / docs / sortedcontainersgithub.com / grantjenks / python-sortedcontainers私は、リストからセットへのリファクタリングを考えていました。重複をしたいし、その後にSortedSet実装を探していた、とcollectionsモジュールでものを見つけられませんでした...出典:stackoverflow.com/questions/5953205/...
JGFMK

3
sort関数がこのように設計されたのはなぜですか?Noneの代わりにソートされたリストを返す場合、パフォーマンスのオーバーヘッドやその他の欠点はありますか?
レイヤン

1
また、次の問題にも直面しprint(newList.sort())ましたNone。しかし、私がしたときnewList.sort()print(newList)それはうまくいきました。
Kots 2018年

135

問題はここにあります:

answer = newList.sort()

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

使用する:

answer = sorted(newList)

5
これは、ほとんどが必要なものである:違いlist.sort()sorted(list)
geekoverdose

62

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()

33
面白いことに、メソッドを持たないリストを返すsplit(":").lower()ため、これは悪いチェーンです。splitlower
SuperBiasedMan 2015年

14

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

イテラブルを取り、その項目のソートされた新しいリストを返したい場合は、sorted組み込み関数を使用します。


14

Pythonには2種類のソートがあります。ソートメソッド(または「メンバー関数」)とソート関数です。sortメソッドは、指定されたオブジェクトのコンテンツを操作します。これは、オブジェクトが自身を並べ替えるために実行しているアクションと考えてください。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からの不在期間の後に忘れていることを、それらの奇妙な、やや迷惑な内容の一つであり、私は再び忘れないでください)。

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]

返された値があることに注意していないディープコピーので、いつものように、リスト内に含まれる要素の上にサイド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]]

4

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

sort()メソッドは指定されたリストの要素を特定の順序(昇順または降順)で並べ替えるだけで、値を返しません。

だから問題はanswer = newList.sort()答えがどこにもないところにあります。

代わりに、あなたはただ行うことができますreturn newList.sort()

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

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

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

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

注:sort()とSorted()の最も単純な違いは次のとおりです。sort()は値を返しませんが、sorted()は反復可能なリストを返します。

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


0

ソートされたリストを返す場合は、sorted()メソッドを使用できます。より便利です。

l1 = []
n = int(input())

for i in range(n):
  user = int(input())
  l1.append(user)
sorted(l1,reverse=True)

list.sort()メソッドは、リストをインプレースで変更し、Noneを返します。

それでもソートを使用したい場合は、これを行うことができます。

l1 = []
n = int(input())

for i in range(n):
  user = int(input())
  l1.append(user)
l1.sort(reverse=True)
print(l1)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.