Mengapa “return list.sort ()” mengembalikan None, not the list?


154

Saya sudah dapat memverifikasi bahwa findUniqueWordshasil tidak diurutkan list. Namun, itu tidak mengembalikan daftar. Mengapa?

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

Saya tidak berpikir Anda perlu mengubah item menjadi string berkali-kali. Sekali biasanya cukup dan lebih bersih untuk melakukannya pada input untuk membersihkan juga.
Ben

3
Hanya pemikiran yang konyol, tetapi jika Anda menginginkan daftar barang unik, mengapa Anda tidak mengubahnya menjadi satu set? Anda kemudian dapat mengonversinya kembali ke daftar jika perlu. theSet= set(theList) Dan Anda selesai, Anda hanya perlu mengembalikannya ke daftar: theList = list(theSet) Selesai. Mudah.
runlevel0

1
Menambahkan apa yang dikatakan @ runlevel0 (yang merupakan ide bagus): Anda dapat mengonversi yang theSet' into a sorted list with diurutkan (theSet) `.
Zaz

bahasa yang sangat tidak biasa
nicolas

Ini adalah pilihan filosofis - tetapi bermasalah / menjengkelkan - dari bahasa ini. Chaining secara umum adalah konsep yatim dengan python.
javadba

Jawaban:


194

list.sortmengurutkan daftar di tempat, yaitu tidak mengembalikan daftar baru. Cukup tulis

newList.sort()
return newList

18
return sorted(newList)lebih pendek. Tidak masalah di sini karena variabelnya lokal, tetapi pengurutan di tempat dapat mengubah variabel bersama dalam beberapa kasus.
Jean-François Fabre

Sangat menarik bahwa jika sebuah entri ditambahkan ke daftar a.append('x'), atau a.extend('x)Anda tidak dapat membuat rantai sort()di bagian akhir. Itu harus dibagi menjadi 2 baris. Itu akan lebih baik jika metode mengembalikan daftar! docs.python.org/3/tutorial/datastructures.html Pesan yang sama menggigit saya dengan melakukan hal itu. Akibatnya Anda harus memecahnya menjadi dua baris, Anda harus menggunakan .sort() TIDAK sorted() pada daftar setelahnya, karena ini menghasilkan kesalahan yang sama l = ['1']; l = sorted(l.append('2'))(saya baru saja menambahkan semi-kolon sehingga Anda dapat memotong / menempel dan menjalankan)
JGFMK

Saya juga menambahkan bahwa mungkin patut untuk dilihat di sini: grantjenks.com/docs/sortedcontainers , github.com/grantjenks/python-sortedcontainers Di saya, saya sudah memikirkan refactoring dari daftar ke set, karena saya tidak ingin duplikat, dan kemudian mencari implementasi SortedSet, dan tidak menemukannya dalam modul koleksi ... Sumber: stackoverflow.com/questions/5953205/…
JGFMK

3
Mengapa itu sortfungsi dirancang dengan cara ini? apakah ada overhead kinerja atau kelemahan lain jika mengembalikan daftar yang diurutkan alih-alih Tidak Ada?
Lei Yang

1
Saya juga menghadapi masalah berikut: print(newList.sort())memberi None. Namun ketika saya melakukannya, newList.sort()dan kemudian print(newList)berhasil.
Kots

135

Masalahnya ada di sini:

answer = newList.sort()

sorttidak mengembalikan daftar yang diurutkan; alih-alih, ini mengurutkan daftar pada tempatnya.

Menggunakan:

answer = sorted(newList)

5
Inilah yang paling dibutuhkan: perbedaan antara list.sort()dan sorted(list).
geekoverdose

62

Berikut ini adalah email dari Guido van Rossum dalam daftar dev Python menjelaskan mengapa ia memilih untuk tidak kembali selfpada operasi yang mempengaruhi objek dan tidak mengembalikan yang baru.

Ini berasal dari gaya pengkodean (populer di berbagai bahasa lain, saya percaya terutama Lisp bersenang-senang di dalamnya) di mana serangkaian efek samping pada satu objek dapat dirantai seperti ini:

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

yang akan sama dengan

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

Saya menemukan bentuk rantai ancaman terhadap keterbacaan; itu mensyaratkan bahwa pembaca harus akrab dengan masing-masing metode. Bentuk kedua memperjelas bahwa masing-masing panggilan ini bertindak pada objek yang sama, dan bahkan jika Anda tidak mengetahui kelas dan metodenya dengan baik, Anda dapat memahami bahwa panggilan kedua dan ketiga diterapkan ke x (dan bahwa semua panggilan dibuat untuk efek sampingnya), dan bukan ke hal lain.

Saya ingin memesan rantai untuk operasi yang mengembalikan nilai baru, seperti operasi pemrosesan string:

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

33
Yang mengherankan, split(":").lower()adalah rantai buruk karena splitmengembalikan daftar yang tidak memiliki lowermetode.
SuperBiasedMan

14

Python biasa kembali Nonedari fungsi dan metode yang bermutasi data, seperti list.sort, list.append, dan random.shuffle, dengan gagasan bahwa hal itu mengisyaratkan fakta bahwa itu bermutasi.

Jika Anda ingin mengambil iterable dan mengembalikan daftar item yang baru diurutkan, gunakan sortedfungsi builtin.


14

Python memiliki dua macam: metode sortir (atau "fungsi anggota") dan fungsi sortir . Metode pengurutan beroperasi pada konten objek bernama - menganggapnya sebagai tindakan yang diambil objek untuk memesan ulang sendiri . Fungsi sortir adalah operasi atas data yang diwakili oleh suatu objek dan mengembalikan objek baru dengan konten yang sama dalam urutan diurutkan.

Diberikan daftar bilangan bulat bernama ldaftar itu sendiri akan disusun ulang jika kita memanggil l.sort():

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

Metode ini tidak memiliki nilai balik. Tetapi bagaimana jika kita mencoba menetapkan hasil l.sort()?

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

rsekarang sama dengan tidak ada. Ini adalah salah satu dari detail-detail aneh dan agak menjengkelkan yang mungkin akan dilupakan oleh seorang programmer setelah periode ketidakhadiran dari Python (itulah sebabnya saya menulis ini, jadi saya tidak lupa lagi).

Fungsi sorted(), di sisi lain, tidak akan melakukan apa pun untuk isi l, tetapi akan mengembalikan daftar baru yang disortir dengan konten yang sama seperti 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]

Sadarilah bahwa nilai yang dikembalikan adalah tidak sebuah salinan dalam , jadi berhati-hati tentang operasi sisi-effecty atas unsur-unsur yang terkandung dalam daftar seperti biasa:

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

Untuk memahami mengapa itu tidak mengembalikan daftar:

sort () tidak mengembalikan nilai apapun sementara jenis () metode hanya macam elemen dari daftar yang diberikan dalam urutan tertentu - naik atau turun tanpa kembali nilai apapun.

Jadi masalahnya adalah di answer = newList.sort()mana jawabannya tidak ada.

Sebaliknya Anda bisa melakukannya return newList.sort().

Sintaks metode sort () adalah:

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

Atau, Anda juga dapat menggunakan fungsi bawaan Python yang diurutkan () untuk tujuan yang sama.

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

Catatan: Perbedaan paling sederhana antara sort () dan sortir () adalah: sort () tidak mengembalikan nilai apa pun, disortir () mengembalikan daftar iterable.

Jadi dalam kasus Anda answer = sorted(newList).


0

Anda dapat menggunakan metode diurutkan () jika Anda ingin mengembalikan daftar yang diurutkan. Lebih nyaman.

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

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

metode list.sort () memodifikasi daftar di tempat dan mengembalikan Tidak Ada.

jika Anda masih ingin menggunakan sort, Anda dapat melakukan ini.

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

for i in range(n):
  user = int(input())
  l1.append(user)
l1.sort(reverse=True)
print(l1)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.