Tại sao lại trả về list.sort ().


154

Tôi đã có thể xác minh rằng findUniqueWordskết quả không được sắp xếp list. Tuy nhiên, nó không trả về danh sách. Tại sao?

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

Tôi không nghĩ bạn cần biến vật phẩm thành một chuỗi nhiều lần như vậy. Một lần là đủ bình thường và nó cũng sạch hơn để làm điều đó trên đầu vào để dọn dẹp.
Ben

3
Chỉ là một suy nghĩ ngớ ngẩn, nhưng nếu bạn muốn có một danh sách các mặt hàng độc đáo, tại sao bạn không chuyển đổi thành một bộ? Sau đó, bạn có thể chuyển đổi chúng trở lại danh sách nếu bạn cần. theSet= set(theList) Và bạn đã hoàn thành, bạn chỉ cần đưa nó trở lại danh sách: theList = list(theSet) Xong. Dễ dàng.
runlevel0

1
Thêm vào những gì @ runlevel0 đã nói (đó là một ý tưởng hay): Bạn có thể chuyển đổi một theSet' into a sorted list with `được sắp xếp (`).
Zaz

ngôn ngữ rất bất thường
nicolas

Đây là một cốt lõi - nhưng có vấn đề / khó chịu - sự lựa chọn triết học của ngôn ngữ. Chaining nói chung là một khái niệm mồ côi ở python.
javadba

Câu trả lời:


194

list.sortsắp xếp danh sách tại chỗ, tức là nó không trả về danh sách mới. Chỉ viết

newList.sort()
return newList

18
return sorted(newList)ngắn hơn Không quan trọng ở đây vì biến là cục bộ, nhưng sắp xếp tại chỗ có thể thay đổi một biến được chia sẻ trong một số trường hợp.
Jean-François Fabre

Thật thú vị nếu một mục được thêm vào danh sách a.append('x'), hoặc a.extend('x)bạn không thể xâu chuỗi sort()ở cuối. Nó phải được chia thành 2 dòng. Nó sẽ đẹp hơn nếu các phương thức trả về danh sách! docs.python.org/3/tutorial/datastructures.html Thông điệp tương tự này cắn tôi bằng cách làm điều đó. Do đó, bạn phải chia thứ đó thành hai dòng, Bạn phải sử dụng .sort() KHÔNG sorted() trong danh sách sau đó, vì điều này tạo ra cùng một lỗi l = ['1']; l = sorted(l.append('2'))(Tôi chỉ thêm dấu chấm phẩy để bạn có thể cắt / dán và chạy)
JGFMK

Tôi cũng thêm nó có thể đáng xem ở đây: Grantjenks.com/docs/sortcontainers , github.com/grantjenks/python-sortcontainers Trong tôi, tôi đã nghĩ đến việc tái cấu trúc từ một danh sách thành một tập hợp, vì tôi đã không muốn sao chép và sau đó tìm kiếm một triển khai Sắp xếp và không tìm thấy một trong mô-đun bộ sưu tập ... Nguồn: stackoverflow.com/questions/5953205/
Lỗi

3
Tại sao được sortchức năng được thiết kế theo cách này? Có bất kỳ chi phí hoạt động hoặc nhược điểm nào khác nếu trả về danh sách đã sắp xếp thay vì Không?
Lôi Dương

1
Tôi cũng phải đối mặt với vấn đề folowing: print(newList.sort())đã cho None. Tuy nhiên khi tôi đã làm, newList.sort()và sau đó print(newList)nó làm việc.
Kots

135

Vấn đề là ở đây:

answer = newList.sort()

sortkhông trả về danh sách đã sắp xếp; thay vào đó, nó sắp xếp danh sách tại chỗ.

Sử dụng:

answer = sorted(newList)

4
Đây là những gì hầu hết sẽ cần: sự khác biệt giữa list.sort()sorted(list).
geekoverdose

62

Đây là một email từ Guido van Rossum trong danh sách nhà phát triển của Python giải thích lý do tại sao anh ta chọn không quay lại các selfhoạt động ảnh hưởng đến đối tượng và không trả lại một cái mới.

Điều này xuất phát từ một phong cách mã hóa (phổ biến trong nhiều ngôn ngữ khác, tôi tin đặc biệt là Lisp trong đó) trong đó một loạt các tác dụng phụ trên một đối tượng có thể được xâu chuỗi như thế này:

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

sẽ giống như

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

Tôi thấy hình thức xích là mối đe dọa cho khả năng đọc; nó đòi hỏi người đọc phải làm quen với từng phương thức. Biểu mẫu thứ hai cho thấy rõ rằng mỗi cuộc gọi này hoạt động trên cùng một đối tượng và vì vậy ngay cả khi bạn không biết rõ về lớp và phương thức của nó, bạn có thể hiểu rằng cuộc gọi thứ hai và thứ ba được áp dụng cho x (và điều đó tất cả các cuộc gọi được thực hiện cho các tác dụng phụ của chúng), và không phải cho một cái gì khác.

Tôi muốn bảo lưu chuỗi cho các hoạt động trả về giá trị mới, như hoạt động xử lý chuỗi:

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

33
Thật thú vị, split(":").lower()là một chuỗi xấu vì splittrả về một danh sách không có lowerphương thức.
SuperBiasedMan

14

Python có thói quen trở về Nonetừ chức năng và phương pháp đột biến dữ liệu, chẳng hạn như list.sort, list.appendrandom.shuffle, với ý tưởng được rằng nó gợi ý đến một thực tế rằng nó đã được biến đổi.

Nếu bạn muốn thực hiện một lần lặp và trả về một danh sách mới, được sắp xếp các mục của nó, hãy sử dụng sortedhàm dựng sẵn.


14

Python có hai loại sắp xếp: phương thức sắp xếp (hoặc "hàm thành viên") và hàm sắp xếp . Phương thức sort hoạt động dựa trên nội dung của đối tượng được đặt tên - nghĩ về nó như một hành động mà đối tượng đang thực hiện để tự sắp xếp lại . Hàm sort là một thao tác trên dữ liệu được đại diện bởi một đối tượng và trả về một đối tượng mới có cùng nội dung theo thứ tự được sắp xếp.

Đưa ra một danh sách các số nguyên có tên l, danh sách đó sẽ được sắp xếp lại nếu chúng ta gọi l.sort():

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

Phương pháp này không có giá trị trả về. Nhưng nếu chúng ta cố gắng chỉ định kết quả l.sort()thì sao?

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

rbây giờ bằng thực tế không có gì. Đây là một trong những chi tiết kỳ lạ, hơi khó chịu mà một lập trình viên có thể sẽ quên sau một thời gian vắng mặt với Python (đó là lý do tại sao tôi viết bài này, vì vậy tôi không quên nữa).

Mặt sorted()khác, hàm sẽ không làm gì với nội dung của l, nhưng sẽ trả về một danh sách mới, được sắp xếp với cùng nội dung như 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]

Xin lưu ý rằng giá trị được trả về không phải là một bản sao sâu , vì vậy hãy thận trọng với các hoạt động có hiệu lực phụ đối với các yếu tố có trong danh sách như bình thường:

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

Để hiểu lý do tại sao nó không trả về danh sách:

sort () không trả về bất kỳ giá trị nào trong khi phương thức sort () chỉ sắp xếp các phần tử của danh sách đã cho theo một thứ tự cụ thể - tăng dần hoặc giảm dần mà không trả về bất kỳ giá trị nào.

Vì vậy, vấn đề là với answer = newList.sort()câu trả lời là không có.

Thay vào đó bạn chỉ có thể làm return newList.sort().

Cú pháp của phương thức sort () là:

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

Ngoài ra, bạn cũng có thể sử dụng hàm dựng sẵn của Python được sắp xếp () cho cùng một mục đích.

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

Lưu ý: Sự khác biệt đơn giản nhất giữa sort () và sort () là: sort () không trả về bất kỳ giá trị nào trong khi, sort () trả về một danh sách lặp.

Vì vậy, trong trường hợp của bạn answer = sorted(newList).


0

bạn có thể sử dụng phương thức sort () nếu bạn muốn nó trả về danh sách đã sắp xếp. Nó thuận tiện hơn.

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

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

Phương thức list.sort () sửa đổi danh sách tại chỗ và trả về Không có.

Nếu bạn vẫn muốn sử dụng sort, bạn có thể làm điều này.

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

for i in range(n):
  user = int(input())
  l1.append(user)
l1.sort(reverse=True)
print(l1)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.