2009-03-13 26 views
53

Theo kinh nghiệm, có vẻ như trình sắp xếp danh sách mặc định của Python, khi chuyển qua danh sách các bộ dữ liệu, sẽ sắp xếp theo phần tử đầu tiên trong mỗi bộ dữ liệu. Đúng không? Nếu không, cách đúng đắn để sắp xếp danh sách các bộ dữ liệu bằng các phần tử đầu tiên của chúng là gì?Python sắp xếp danh sách các bộ dữ liệu như thế nào?

+5

Bạn có thực sự chạy mã ví dụ? Nếu vậy, bạn đã thấy gì? Vui lòng gửi mã mẫu của bạn. –

Trả lời

67

Tự động sắp xếp danh sách các bộ dữ liệu theo các phần tử đầu tiên trong bộ dữ liệu, sau đó là các phần tử thứ hai và bộ tuple ([1,2,3]) sẽ xuất hiện trước tuple ([1,2,4]) . Nếu bạn muốn ghi đè hành vi này, hãy chuyển một cuộc gọi có thể gọi làm đối số thứ hai cho phương thức sắp xếp. Số điện thoại này phải trả về 1, -1, 0.

+15

Không sử dụng đối số cmp nếu đối số khóa cần sắp xếp sẽ thực hiện! Đó là thích foo.sort (key = lambda x: x [1]) để foo.sort (lambda x, y: cmp (x [1], y [1])). Nó dễ hiểu hơn và hiệu quả hơn nhiều. – cthulahoops

+9

@cthulahoops Tôi nghĩ rằng việc sử dụng 'operator.itemgetter' trong trường hợp đó tốt hơn hàm lambda:' foo.sort (key = operator.itemgetter (1)) 'đẹp hơn' foo.sort (key = lambda x: x [1]) '. Đó chỉ là ý kiến ​​của tôi. –

+0

Thật tuyệt khi có liên kết phù hợp với tài liệu. – gaazkam

8

Có, đây là mặc định. Trên thực tế, đây là cơ sở của thành ngữ "DSU" (trang trí-sắp xếp-Undecorate) cổ điển trong Python. Xem Code Like a Pythonista.

5

Không, bộ dữ liệu là sequence types giống như chuỗi. Chúng được sắp xếp giống nhau, bằng cách so sánh từng phần tử theo thứ tự:

>>> import random 
>>> sorted([(0,0,0,int(random.getrandbits(4))) for x in xrange(10)]) 
[(0, 0, 0, 0), (0, 0, 0, 4), (0, 0, 0, 5), (0, 0, 0, 7), (0, 0, 0, 8), 
(0, 0, 0, 9), (0, 0, 0, 12), (0, 0, 0, 12), (0, 0, 0, 12), (0, 0, 0, 14)] 

Ba số 0 chỉ ở đó để chỉ ra rằng một yếu tố nào đó không phải là yếu tố đầu tiên phải được kiểm tra.

+0

Hm. Tôi dường như là thiểu số ... Tôi không hiểu kết quả thử nghiệm của mình, nếu Python sắp xếp bằng cách chỉ xem xét phần tử đầu tiên trong mỗi bộ dữ liệu. – unwind

+0

Bắt đầu với mục đầu tiên, nhưng sau đó chuyển sang. Xem câu trả lời của Vasil. –

0

Hãy thử sử dụng phương pháp sắp xếp danh sách nội bộ và chuyển một lambda. Nếu phần tử đầu tiên của bạn là một số nguyên, thì nó sẽ hoạt động.

# l is the list of tuples 
l.sort(lambda x,y: x-y) 

Bạn có thể sử dụng bất kỳ callable cho so sánh chức năng, không nhất thiết là một lambda. Tuy nhiên nó cần trả về -1 (nhỏ hơn), 0 (bằng) hoặc 1 (lớn hơn).

+0

-1: Làm thế nào điều này sẽ làm việc với một danh sách các bộ dữ liệu? Tôi nhận được TypeError: loại toán hạng không được hỗ trợ (s) cho -: 'tuple' và 'tuple' –

+0

Hàm lambda sẽ được thực hiện trong sắp xếp phải có một đối số, là phần tử iteratables của một tupla serie: pairs.sort (cặp key = lambda: pair [1]). pairs.sort (cặp khóa = lambda: pair [1]) hoặc pairs.sort (key = lambda pair: pair [1], pair [0]) nếu bạn muốn có một lớp thứ tự thứ hai sau khi đặt hàng bởi phần tử đầu tiên . – Alex

0

Check-out "Devin Jeanpierre" câu trả lời cho câu hỏi này sort-a-dictionary-in-python-by-the-value nơi ông nói sử dụng một tuple và cho thấy làm thế nào để sắp xếp theo giá trị thứ hai

Các vấn đề liên quan