Sắp xếp các bộ giá trị dựa trên tham số thứ hai


93

Tôi có một danh sách các bộ giá trị trông giống như sau:

("Person 1",10)
("Person 2",8)
("Person 3",12)
("Person 4",20)

Những gì tôi muốn tạo ra, là danh sách được sắp xếp theo thứ tự tăng dần, theo giá trị thứ hai của bộ giá trị. Vì vậy, L [0] nên ("Person 2", 8)sau khi sắp xếp.

Tôi có thể làm cái này như thế nào? Sử dụng Python 3.2.2 Nếu điều đó hữu ích.


1
có thể trùng lặp của Sorting một tuple chứa tuples
JBernardo

Câu trả lời:


187

Bạn có thể sử dụng keytham số để list.sort():

my_list.sort(key=lambda x: x[1])

hoặc nhanh hơn một chút

my_list.sort(key=operator.itemgetter(1))

(Như với bất kỳ mô-đun nào, bạn sẽ cần import operatorcó thể sử dụng nó.)


3
Tôi đã thử sử dụng L.sort(key=operator.itemgetter(1))trong mã của mình, nhưng tôi nhận được Lỗi Tên, 'toán tử' đó không được xác định. Tôi có cần nhập bất cứ thứ gì đặc biệt không?
user974703 10/12/11

3
Đã tìm kiếm một chút, cần sử dụng import operatorđể sử dụng chức năng. Nếu bạn thêm điều đó vào câu trả lời của mình, tôi sẽ đánh dấu nó được chấp nhận.
user974703 10/12/11

Thử nghiệm với timeit.timeit (tùy chọn mặc định) có không phải là một sự khác biệt lớn giữa hai phương pháp sau đây: operator.itemgetter = 1.05μs, lambda = 1.25μs mỗi lần lặp
Noel Evans

Cảm ơn giải pháp my_list.sort (key = operator.itemgetter (1)) !! :)
aman_novice

1
Nếu bạn chưa quen với từ khóa lambda: stackoverflow.com/questions/13669252/what-is-key-lambda
EchoLynx,

12

Và nếu bạn đang sử dụng python 3.X, bạn có thể áp dụng sortedchức năng trên danh sách của tôi . Đây chỉ là một bổ sung cho câu trả lời mà @Sven Marnach đã đưa ra ở trên.

# using *sort method*
mylist.sort(lambda x: x[1]) 

# using *sorted function*
sorted(mylist, key = lambda x: x[1]) 

Đây chỉ là cài đặt sẵn trả về một danh sách mới. Câu trả lời của bạn không đóng góp gì cho những cái đã có ở đây, vì rõ ràng là nếu bạn muốn có một danh sách mới, bạn sẽ sử dụng sortedthay thế list.sort.
miradulo

2
@SamuelNde Tôi đã cuộn xuống đây vì tôi không chắc liệu biểu thức có hoạt động giống nhau đối với được sắp xếp hay không, vì vậy nó đã giúp tôi.
Cô bé quàng khăn đỏ

Yeah đồng ý, điều này cũng giúp tôi
StackG

-1
    def findMaxSales(listoftuples):
        newlist = []
        tuple = ()
        for item in listoftuples:
             movie = item[0]
             value = (item[1])
             tuple = value, movie

             newlist += [tuple]
             newlist.sort()
             highest = newlist[-1]
             result = highest[1]
       return result

             movieList = [("Finding Dory", 486), ("Captain America: Civil                      

             War", 408), ("Deadpool", 363), ("Zootopia", 341), ("Rogue One", 529), ("The  Secret Life of Pets", 368), ("Batman v Superman", 330), ("Sing", 268), ("Suicide Squad", 325), ("The Jungle Book", 364)]
             print(findMaxSales(movieList))

đầu ra -> Rogue One


Một vài suy nghĩ: Điều này thực sự không trả lời câu hỏi (làm thế nào để có được một danh sách được sắp xếp theo một giá trị trong bộ tuple); Bạn có thể giải nén bộ tuple trực tiếp trong vòng lặp của mình (đối với phim, giá trị trong listoftuples:); bạn đã ghi đè kiểu 'tuple'; Và nó thực sự có thể được thực hiện là một danh sách hiểu duy nhất: (cửa sổ mới được sắp xếp ((giá trị, phim) cho bộ phim, giá trị trong listoftuples) [- 1] [1])
RFox

Tôi đánh giá cao những gì bạn đang làm, nhưng tôi sẽ tranh luận rằng nó thiếu sự sang trọng và có thể được cải thiện. Nói chung, nó sẽ được coi là thực hành kém để chuyển đổi thứ tự của các phần tử trong một cuộn như thế này. Tôi nghĩ rằng các điểm về khả năng hiểu danh sách và giải nén các cuộn dây vẫn sẽ có giá trị. Và tôi sẽ không khuyến khích bất cứ ai sử dụng phương pháp này đối với câu trả lời được chấp nhận.
RFox

Tôi không có khả năng và không thể lấy mã bạn được đưa lên làm việc, nhiều khả năng lỗi người dùng
Darrell Trắng

nhưng đã thay đổi nó một chút và chắc chắn câu trả lời của bạn tốt hơn gấp 200 lần.
Darrell White

def findMaxSales (listoftuples): newlist = sorted ((value, movies) cho phim, value trong listoftuples) return newlist [-1] [1] movieList = [("Finding Dory", 486), ("Captain America: Civil War ", 408), (" Deadpool ", 363), (" Zootopia ", 341), (" Rogue One ", 529), (" Cuộc sống bí mật của thú cưng ", 368), (" Batman v Superman ", 330 ), ("Sing", 268), ("Suicide Squad", 325), ("The Jungle Book", 364)] print (findMaxSales (movieList))
Darrell White
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.