“Return list.sort ()” neden listeyi değil, None döndürüyor?


155

Bunun findUniqueWordsbir sıralama ile sonuçlandığını doğrulayabildim list. Ancak listeyi döndürmez. Neden?

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

Öğeyi birçok kez bir dizeye dönüştürmeniz gerektiğini düşünmüyorum. Bir kez normalde yeterlidir ve bunu temizlemek için girişte yapmak daha temizdir.
Ben

3
Sadece aptalca bir düşünce, ama benzersiz öğelerin bir listesini istiyorsanız, neden sadece bir sete dönüştürmüyorsunuz? Daha sonra, gerekirse bir listeye geri dönüştürebilirsiniz. theSet= set(theList) Ve işiniz bitti, sadece listeye geri atmanız gerekiyor: theList = list(theSet) Tamam. Kolay.
runlevel0

1
@ theSet' into a sorted list with Runlevel0'ın söylediklerine ekleme (ki bu iyi bir fikirdir): Sıralı (set) `i dönüştürebilirsiniz .
Zaz

çok düzensiz dil
nicolas

Bu, dilin çekirdek - ama sorunlu / tahriş edici - felsefi bir seçimidir. Genel olarak zincirleme, python'da yetim bir kavramdır.
javadba

Yanıtlar:


195

list.sortlisteyi yerinde sıralar, yani yeni bir liste döndürmez. Sadece yaz

newList.sort()
return newList

18
return sorted(newList)daha kısadır. Değişken yerel olduğu için burada önemli değil, ancak yerinde sıralama bazı durumlarda paylaşılan bir değişkeni değiştirebilir.
Jean-François Fabre

Bir giriş bir listeye eklenirse ya a.append('x')da sonunda a.extend('x)zincirleme yapamazsanız ilginçtir sort(). 2 satıra bölünmelidir. Listeyi iade yöntemleri olsaydı daha güzel olurdu! docs.python.org/3/tutorial/datastructures.html Aynı mesaj, bunu yaparak beni çok etkiledi . Sonuç olarak, şeyi iki satıra .sort() sorted()l = ['1']; l = sorted(l.append('2'))
ayırmanız gerekir

Ayrıca şunu da eklemeye değer olabilir: grantjenks.com/docs/sortedcontainers , github.com/grantjenks/python-sortedcontainers Benim, zaten bir listeden bir sete yeniden düzenleme düşünüyordum, çünkü yinelenenleri istiyor ve bir SortedSet uygulaması arıyordu ve koleksiyonlar modülünde bir tane bulamadı ... Kaynak: stackoverflow.com/questions/5953205/…
JGFMK

3
Neden oldu sortfonksiyonu bu şekilde tasarlanmıştır? Hiçbiri yerine sıralanmış listeyi döndürürseniz performans ek yükü veya başka dezavantajlar var mı?
Lei Yang

1
Ayrıca şu sorunla da karşılaştım: print(newList.sort())verdi None. Ancak ne zaman yaptım newList.sort()ve sonra print(newList)çalıştı.
Kots

136

Sorun burada:

answer = newList.sort()

sortsıralı listeyi döndürmez; bunun yerine listeyi yerinde sıralar.

kullanın:

answer = sorted(newList)

5
En çok ihtiyaç duyacağınız şey budur: list.sort()ve arasındaki fark sorted(list).
geekoverdose

62

Python'un dev listesindeki Guido van Rossum'dan self, nesneyi etkileyen işlemleri neden geri döndürmemeyi ve yenisini döndürmemeyi açıklayan bir e-posta .

Bu, tek bir nesne üzerinde bir dizi yan etkinin bu şekilde zincirlenebileceği bir kodlama stilinden (diğer dillerde popüler, özellikle de Lisp'in eğlenmesine inanıyorum) geliyor:

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

ki aynı

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

Zincirleme şekli okunabilirlik için bir tehdit olarak görüyorum; okuyucunun her bir yöntemi yakından tanıması gerekir. İkinci form, bu çağrıların her birinin aynı nesne üzerinde hareket ettiğini açıkça gösterir ve böylece sınıfı ve yöntemlerini çok iyi bilmeseniz bile, ikinci ve üçüncü çağrının x'e uygulandığını (ve tüm çağrılar yan etkileri için yapılır), başka bir şeye değil.

Zincir işleme işlemleri gibi yeni değerler döndüren işlemler için zincirleme ayırmak istiyorum:

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

33
Eğlenceli, split(":").lower()kötü bir zincir çünkü yöntemi splitolmayan bir liste döndürür lower.
SuperBiasedMan

14

Python alışkanlıkla döner Nonefonksiyonları ve bu şekilde veri mutasyona yöntemler gelen list.sort, list.appendve random.shufflefikri onu mutasyona olduğu gerçeğine ima eder olmak üzere.

Yinelenebilir bir öğe alıp öğelerinin yeni, sıralı bir listesini döndürmek istiyorsanız sortedyerleşik işlevini kullanın .


14

Python'un iki çeşit türü vardır: bir sıralama yöntemi (veya "üye işlevi") ve bir sıralama işlevi . Sıralama yöntemi adlı nesnenin içeriği üzerinde çalışır - bunu nesnenin kendisini yeniden sipariş etmek için gerçekleştirdiği bir eylem olarak düşünün . Sıralama işlevi, bir nesne tarafından temsil edilen veriler üzerinde yapılan bir işlemdir ve aynı içeriğe sahip yeni bir nesneyi sıralı olarak döndürür.

Verilen bir tamsayılar listesi verildiğinde l, listenin kendisi yeniden sıralanır l.sort():

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

Bu yöntemin bir dönüş değeri yoktur. Ama ya sonucunu atamaya çalışırsak l.sort()?

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

rşimdi hiçbir şeye eşit değil. Bu yüzden (Ben, bu yazıyorum neden olan bir programcı olasılıkla Python gelen yokluğunda bir süre sonra unutmak olduğunu o tuhaf, biraz can sıkıcı detaylardan biridir ben yine unutmayın).

sorted()Öte yandan işlev , içeriğine hiçbir şey yapmaz l, ancak aşağıdakilerle aynı içeriğe sahip yeni, sıralı bir liste döndürür 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]

Döndürülen değer olduğunu unutmayın değil bir derin kopya böylece her zamanki gibi listenin içinde yer alan unsurların üzerinde yan effecty operasyonları konusunda ihtiyatlı olmak,:

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

Listeyi neden döndürmediğini anlamak için:

sort () yöntemi , belirli bir listenin öğelerini belirli bir sıraya göre sıralarken bir değer döndürmez - herhangi bir değer döndürmeden artan veya azalan .

Yani sorun answer = newList.sort()cevabın nerede olmadığıdır.

Bunun yerine sadece yapabilirsiniz return newList.sort().

Sort () yönteminin sözdizimi:

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

Alternatif olarak, aynı amaçla Python'un yerleşik () sıralama işlevini de kullanabilirsiniz.

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

Not: sort () ve sort () arasındaki en basit fark: sort () herhangi bir değer döndürmezken, sort () yinelenebilir bir liste döndürür.

Yani sizin durumunuzda answer = sorted(newList).


0

sıralanmış listeyi döndürmesini istiyorsanız sort () yöntemini kullanabilirsiniz. Daha uygun.

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

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

list.sort () yöntemi, listeyi yerinde değiştirir ve None döndürür.

hala sıralama kullanmak istiyorsanız bunu yapabilirsiniz.

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

for i in range(n):
  user = int(input())
  l1.append(user)
l1.sort(reverse=True)
print(l1)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.