ทำไม“ return list.sort ()” ส่งคืน None ไม่ใช่รายการ?


155

ฉันสามารถตรวจสอบได้ว่าสิ่ง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

ฉันไม่คิดว่าคุณจะต้องเปลี่ยนไอเท็มให้เป็นสตริงหลาย ๆ ครั้ง ครั้งเดียวก็เพียงพอแล้วและมันสะอาดกว่าที่จะทำบนอินพุตเพื่อล้างค่า
Ben

3
แค่คิดโง่ ๆ แต่ถ้าคุณต้องการรายการที่ไม่เหมือนใครทำไมคุณไม่เปลี่ยนเป็นเซ็ตล่ะ? จากนั้นคุณสามารถแปลงกลับเป็นรายการหากคุณต้องการ theSet= set(theList) และคุณทำเสร็จแล้วคุณจะต้องโยนมันกลับไปที่รายการ: theList = list(theSet) เสร็จสิ้น ง่าย.
runlevel0

1
การเพิ่มสิ่งที่ @ runlevel0 พูด (ซึ่งเป็นความคิดที่ดี): คุณสามารถแปลงการtheSet' into a sorted list with เรียงลำดับ (theSet) `
Zaz

ภาษาที่ผิดปกติมาก
นิโคลัส

นี่คือหลัก - แต่เป็นปัญหา / ระคายเคือง - การเลือกใช้ปรัชญาของภาษา การผูกมัดโดยทั่วไปเป็นแนวคิดที่กำพร้าในไพ ธ อน
javadba

คำตอบ:


195

list.sortเรียงลำดับรายการในตำแหน่งนั่นคือจะไม่ส่งคืนรายการใหม่ แค่เขียน

newList.sort()
return newList

18
return sorted(newList)สั้นกว่า ไม่สำคัญที่นี่เนื่องจากตัวแปรเป็นแบบโลคัล แต่การเรียงลำดับแบบแทนที่อาจเปลี่ยนตัวแปรแบบแบ่งใช้ในบางกรณี
Jean-François Fabre

เป็นที่น่าสนใจว่าถ้ามีการเพิ่มรายการลงในรายการa.append('x')หรือa.extend('x)คุณไม่สามารถโยงsort()ท้ายได้ จะต้องแบ่งออกเป็น 2 บรรทัด มันจะดีกว่าหากวิธีการคืนรายการ! docs.python.org/3/tutorial/datastructures.html ข้อความเดียวกันนี้กัดฉันด้วยการทำเช่นนั้น ดังนั้นคุณต้องแบ่งสิ่งออกเป็นสองบรรทัดคุณจะต้อง.sort() ไม่ ใช้sorted()ในรายการหลังจากนี้เนื่องจากสร้างข้อผิดพลาดเดียวกัน l = ['1']; l = sorted(l.append('2'))(ฉันเพิ่งเพิ่มเซมิโคลอนเพื่อให้คุณสามารถตัด / วางและเรียกใช้)
JGFMK

ฉันยังเพิ่มมันอาจจะคุ้มค่าดูที่นี่: grantjenks.com/docs/sortedcontainers , github.com/grantjenks/python-sortedcontainersในของฉันแล้วคิดว่า refactoring จากรายการในชุดเพราะฉันไม่ได้ ต้องการรายการที่ซ้ำกันและจากนั้นมองหาการใช้งาน SortedSet และไม่พบหนึ่งในโมดูลคอลเลกชัน ... ที่มา: stackoverflow.com/questions/5953205/…
JGFMK

3
ทำไมsortฟังก์ชั่นจึงถูกออกแบบด้วยวิธีนี้? มีค่าใช้จ่ายในการปฏิบัติงานหรือข้อเสียอื่น ๆ หากส่งคืนรายการที่เรียงลำดับแทน None
Lei Yang

1
ฉันยังต้องเผชิญกับปัญหา folowing นี้ให้print(newList.sort()) Noneอย่างไรก็ตามเมื่อฉันทำnewList.sort()แล้วprint(newList)มันได้ผล
Kots

136

ปัญหาอยู่ที่นี่:

answer = newList.sort()

sortไม่ส่งคืนรายการที่เรียงลำดับ ค่อนข้างจะเรียงลำดับรายการในสถานที่

ใช้:

answer = sorted(newList)

5
นี่คือสิ่งที่ดีที่สุดจะต้อง: ความแตกต่างระหว่างและlist.sort() sorted(list)
geekoverdose

62

นี่คืออีเมลจาก Guido van Rossum ในรายการ dev ของ Python อธิบายว่าทำไมเขาถึงเลือกที่จะไม่ส่งคืนselfการดำเนินการที่ส่งผลกระทบต่อวัตถุและจะไม่ส่งคืนใหม่

นี่มาจากสไตล์การเขียนโค้ด (เป็นที่นิยมในภาษาอื่น ๆ ฉันเชื่อว่าโดยเฉพาะอย่างยิ่งเสียงกระเพื่อม) ซึ่งชุดของผลข้างเคียงบนวัตถุชิ้นเดียวสามารถถูกล่ามโซ่เช่นนี้:

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

ซึ่งจะเหมือนกับ

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

ฉันพบว่าการผูกมัดเป็นภัยคุกคามต่อการอ่านได้ มันต้องการให้ผู้อ่านจะต้องคุ้นเคยอย่างใกล้ชิดกับแต่ละวิธี รูปแบบที่สองทำให้ชัดเจนว่าการเรียกเหล่านี้แต่ละการกระทำบนวัตถุเดียวกันและดังนั้นแม้ว่าคุณจะไม่ทราบคลาสและวิธีการที่ดีมากคุณสามารถเข้าใจว่าการโทรที่สองและสามถูกนำไปใช้กับ x (และ การโทรทั้งหมดทำขึ้นสำหรับผลข้างเคียงของพวกเขา) และไม่ใช่สิ่งอื่น

ฉันต้องการจองการผูกมัดสำหรับการดำเนินการที่ส่งคืนค่าใหม่เช่นการดำเนินการกับสตริง:

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

33
ที่น่าขบขันsplit(":").lower()เป็นห่วงโซ่ไม่ดีเพราะsplitส่งกลับรายการที่ไม่มีlowerวิธีการ
SuperBiasedMan

14

งูหลามเป็นปกติวิสัยผลตอบแทนNoneจากการทำงานและวิธีการที่เปลี่ยนแปลงข้อมูลเช่นlist.sort, list.appendและrandom.shuffleด้วยความคิดที่ว่ามันเป็นนัยถึงความจริงที่ว่ามันถูกกรรมวิธี

หากคุณต้องการทำซ้ำและส่งคืนรายการที่เรียงลำดับใหม่ของรายการใช้sortedฟังก์ชัน builtin


14

งูหลามมีสองชนิดของการเรียงลำดับ: เรียงลำดับวิธีการ (หรือ "ฟังก์ชันสมาชิก") และการจัดเรียงฟังก์ชั่น วิธีการเรียงลำดับการดำเนินงานเกี่ยวกับเนื้อหาของวัตถุที่มีชื่อ - คิดว่ามันเป็นการกระทำของวัตถุที่ถูกพาไปอีกครั้งเพื่อตัวเอง ฟังก์ชั่นการเรียงลำดับคือการดำเนินการมากกว่าข้อมูลที่แสดงโดยวัตถุและส่งกลับวัตถุใหม่ที่มีเนื้อหาเดียวกันในการเรียงลำดับ

รับรายการจำนวนเต็มชื่อ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 () ไม่ส่งคืนค่าใด ๆ ในขณะที่เมธอด sort () เพียงเรียงลำดับองค์ประกอบของรายการที่กำหนดในลำดับเฉพาะ - จากน้อยไปมากหรือจากมากไปน้อยโดยไม่คืนค่าใด ๆ

ดังนั้นปัญหาอยู่answer = newList.sort()ที่คำตอบคือไม่มี

return newList.sort()แต่คุณก็สามารถทำ

ไวยากรณ์ของวิธีการเรียงลำดับ () คือ:

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

นอกจากนี้คุณยังสามารถใช้ฟังก์ชันที่จัดเรียงไว้ใน Python () เพื่อจุดประสงค์เดียวกัน

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

หมายเหตุ: ความแตกต่างที่ง่ายที่สุดระหว่าง sort () และ sort () คือ: sort () จะไม่ส่งคืนค่าใด ๆ ในขณะที่ sort () จะส่งคืนรายการที่สามารถทำซ้ำได้

answer = sorted(newList)ดังนั้นในกรณีของคุณ


0

คุณสามารถใช้วิธีการเรียง () ถ้าคุณต้องการที่จะกลับรายการเรียง สะดวกกว่า

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

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

list.sort () วิธีการแก้ไขรายการในสถานที่และส่งกลับไม่มี

หากคุณยังต้องการใช้การเรียงคุณสามารถทำได้

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.