Đây là một câu hỏi cũ nhưng một số câu trả lời tôi thấy được đăng không thực sự hoạt động vì zip
không có kịch bản. Những câu trả lời khác không làm phiềnimport operator
và cung cấp thêm thông tin về mô-đun này và lợi ích của nó ở đây.
Có ít nhất hai thành ngữ tốt cho vấn đề này. Bắt đầu với ví dụ đầu vào bạn cung cấp:
X = ["a", "b", "c", "d", "e", "f", "g", "h", "i"]
Y = [ 0, 1, 1, 0, 1, 2, 2, 0, 1 ]
Điều này còn được gọi là Schwartzian_transform sau R. Schwartz , người đã phổ biến mô hình này ở Perl vào những năm 90:
# Zip (decorate), sort and unzip (undecorate).
# Converting to list to script the output and extract X
list(zip(*(sorted(zip(Y,X)))))[1]
# Results in: ('a', 'd', 'h', 'b', 'c', 'e', 'i', 'f', 'g')
Lưu ý rằng trong trường hợp này Y
và X
được sắp xếp và so sánh theo từ vựng. Đó là, các mục đầu tiên (từ Y
) được so sánh; và nếu chúng giống nhau thì các mục thứ hai (từ X
) được so sánh, v.v. Điều này có thể tạo ra không ổn định đầu ra trừ khi bạn bao gồm các chỉ mục danh sách ban đầu cho thứ tự từ điển để giữ các bản sao theo thứ tự ban đầu.
Điều này cho phép bạn kiểm soát trực tiếp hơn về cách sắp xếp đầu vào, do đó bạn có thể sắp xếp sự ổn định bằng cách chỉ cần nêu khóa cụ thể để sắp xếp theo. Xem thêm ví dụ ở đây .
import operator
# Sort by Y (1) and extract X [0]
list(zip(*sorted(zip(X,Y), key=operator.itemgetter(1))))[0]
# Results in: ('a', 'd', 'h', 'b', 'c', 'e', 'i', 'f', 'g')