Làm thế nào để sắp xếp danh sách các danh sách theo một chỉ mục cụ thể của danh sách bên trong?


234

Tôi có một danh sách các danh sách. Ví dụ,

[
[0,1,'f'],
[4,2,'t'],
[9,4,'afsd']
]

Nếu tôi muốn sắp xếp danh sách bên ngoài theo trường chuỗi của danh sách bên trong, bạn sẽ làm thế nào trong python?


6
Liên kết đến hướng dẫn: wiki.python.org/moin/HowTo/Sorting
Felix Kling

Câu trả lời:


321

Đây là một công việc cho itemgetter

>>> from operator import itemgetter
>>> L=[[0, 1, 'f'], [4, 2, 't'], [9, 4, 'afsd']]
>>> sorted(L, key=itemgetter(2))
[[9, 4, 'afsd'], [0, 1, 'f'], [4, 2, 't']]

Cũng có thể sử dụng hàm lambda ở đây, tuy nhiên hàm lambda chậm hơn trong trường hợp đơn giản này


Nếu tôi muốn bỏ qua trường hợp thì sao?
bzupnick

5
@bzupnick, sử dụng key=lambda x:x[2].casefold(). Nếu Python của bạn không đủ mới, chỉ cần sử dụng .lower()thay vì.casefold()
John La Rooy

x = [[[5,3], 1.0345], [[5,6], 5.098], [[5,4], 4,89], [[5,1], 5.97]] Với một danh sách như thế này là có thể chúng ta sắp xếp bằng itemgetter () đối với các phần tử trong x [0] [1]?
nidHi

Tôi cũng có thể lấy các chỉ số của sắp xếp, vì vậy để sắp xếp một danh sách liên quan khác của danh sách theo cùng một thứ tự?
quarky

@quaryk Nghe có vẻ là một câu hỏi thú vị, nhưng không phù hợp để trả lời trong các bình luận. Nếu bạn không thể tìm thấy một câu hỏi bao gồm nó, bạn nên tạo một câu hỏi.
John La Rooy

175

tại chỗ

>>> l = [[0, 1, 'f'], [4, 2, 't'], [9, 4, 'afsd']]
>>> l.sort(key=lambda x: x[2])

không sử dụng được sắp xếp:

>>> sorted(l, key=lambda x: x[2])

4
Bạn có thể cho biết thêm chi tiết về in placenot in place?
qun

9
@qun, "tại chỗ" có nghĩa là bộ nhớ của danh sách cũ được sử dụng lại cho danh sách đã sắp xếp. "không đúng chỗ" có nghĩa là danh sách cũ không thay đổi và danh sách mới được tạo.
John La Rooy

x = [[[5,3], 1.0345], [[5,6], 5.098], [[5,4], 4,89], [[5,1], 5.97]] Với danh sách như thế này là, làm thế nào chúng ta có thể sắp xếp theo các yếu tố trong x [0] [1]?
nidHi

81

Itemgetter cho phép bạn sắp xếp theo nhiều tiêu chí / cột:

sorted_list = sorted(list_to_sort, key=itemgetter(2,0,1))

5
Tôi nghĩ rằng câu trả lời này là rất quan trọng. Tôi nghĩ rằng mọi người đang cố gắng sắp xếp theo các chỉ mục mảng bên trong sẽ rơi vào đây nhưng những người đang tìm cách sắp xếp theo MULTIPLE chỉ mục mảng bên trong sẽ bắt đầu ở đây và câu trả lời của bạn đã giúp tôi thấy rằng itemgetter sẽ thực sự làm điều đó cho bạn!
ZekeDroid

11

nhiều tiêu chí cũng có thể được thực hiện thông qua chức năng lambda

sorted_list = sorted(list_to_sort, key=lambda x: (x[1], x[0]))

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

Bạn có thể dễ dàng sắp xếp bằng đoạn mã này, trong đó 1 là chỉ mục của phần tử.


8

Như thế này:

import operator
l = [...]
sorted_list = sorted(l, key=operator.itemgetter(desired_item_index))

8

Tôi nghĩ rằng chức năng lambda có thể giải quyết vấn đề của bạn.

old_list = [[0,1,'f'], [4,2,'t'],[9,4,'afsd']]

#let's assume we want to sort lists by last value ( old_list[2] )
new_list = sorted(old_list, key=lambda x: x[2])

#Resulst of new_list will be:

[[9, 4, 'afsd'], [0, 1, 'f'], [4, 2, 't']]

2
**old_list = [[0,1,'f'], [4,2,'t'],[9,4,'afsd']]
    #let's assume we want to sort lists by last value ( old_list[2] )
    new_list = sorted(old_list, key=lambda x: x[2])**

sửa tôi nếu tôi sai nhưng không phải là 'x [2]' đang gọi mục thứ 3 trong danh sách chứ không phải mục thứ 3 trong danh sách lồng nhau? nó có nên là x [2] [2] không?


Không, bởi vì key / lambda đã lặp lại các mục trong danh sách cấp đầu tiên. x là một biến cục bộ ràng buộc với từng mục lần lượt.
DragonLord ngày

1

Dễ hiểu hơn (Lambda thực sự đang làm gì):

ls2=[[0,1,'f'],[4,2,'t'],[9,4,'afsd']]
def thirdItem(ls):
    #return the third item of the list
    return ls[2]
#Sort according to what the thirdItem function return 
ls2.sort(key=thirdItem)

0

Sắp xếp một mảng nhiều chiều thực hiện ở đây

arr=[[2,1],[1,2],[3,5],[4,5],[3,1],[5,2],[3,8],[1,9],[1,3]]



arr.sort(key=lambda x:x[0])
la=set([i[0] for i in Points])

for i in la:
    tempres=list()
    for j in arr:
        if j[0]==i:
            tempres.append(j[1])

    for j in sorted(tempres,reverse=True):
        print(i,j)
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.