2009-01-13 28 views
10

Một phần của một chương trình xây dựng danh sách này,python, sắp xếp một danh sách bằng một chìa khóa đó là một chuỗi con của mỗi phần tử

[u'1 x Affinity for war', u'1 x Intellect', u'2 x Charisma', u'2 x Perception', u'3 x Population growth', u'4 x Affinity for the land', u'5 x Morale'] 

Tôi hiện đang cố gắng để sắp xếp nó theo thứ tự abc bằng tên của sự tiến hóa chứ không phải bằng con số. Có cách nào tôi có thể làm điều này mà không cần thay đổi thứ tự hai thứ xuất hiện trong danh sách (như trong 'trí tuệ x 1)?

+1

Như một lưu ý phụ, bạn có thể thấy nó thuận tiện hơn nói chung nếu bạn chuyển đổi nó thành một danh sách các bộ dữ liệu thay vì chuỗi unicode; cụ thể là các bộ dữ liệu có tên thực sự có thể giúp đọc mã. –

Trả lời

23

Bạn có để có được những "chìa khóa" từ chuỗi.

def myKeyFunc(aString): 
    stuff, x, label = aString.partition(' x ') 
    return label 

aList.sort(key= myKeyFunc) 
+0

ý của bạn là gì? – user33061

+0

Chính xác và chính xác những gì được nói. Đó chỉ là "thứ". "các đối tượng không xác định khác" theo Thesaurus. Phương thức phân vùng của một chuỗi trả về ba kết quả. Một trong số đó chỉ là "thứ" không bao giờ được sử dụng nữa. –

+0

Trong ngữ cảnh này, nội dung ở phía trước "x" có thể có ý nghĩa, nhưng chúng ta không thể nói từ câu hỏi đó là gì hay ý nghĩa của nó. Kể từ khi câu hỏi là mơ hồ, chúng tôi chỉ có thể gọi nó là "công cụ". –

-10

Vì bạn đang cố gắng sắp xếp dữ liệu tùy chỉnh về bản chất là gì, tôi sẽ đi với một loại tùy chỉnh.

Merge sort
Bubble sort
Quicksort

+1

Không, bạn muốn sử dụng phương pháp sắp xếp được tích hợp sẵn với bộ so sánh tùy chỉnh. –

+0

Đó có phải là những gì S.Lott đã làm không? Nếu không, bạn sẽ có thể chia sẻ một ví dụ mã? – Teifion

+0

Đó là những gì S. Lott đã làm. – recursive

2

Không biết nếu các mục của bạn được chuẩn hóa ở mức 1 con số, 1 không gian, 1 'x', 1 không gian, nhiều từ tôi đã viết này lên:

mylist = [u'1 x Affinity for war', u'1 x Intellect', u'2 x Charisma', u'2 x Perception', u'3 x Population growth', u'4 x Affinity for the land', u'5 x Morale'] 
def sort(a, b): 
    return cmp(" ".join(a.split()[2:]), " ".join(b.split()[2:])) 

mylist.sort(sort) 

Bạn có thể chỉnh sửa phân tích bên trong sort phương pháp nhưng bạn có thể có được ý tưởng.

Chúc mừng, Patrick

+1

Tốt hơn để sử dụng khóa = so sánh tùy chỉnh khi bạn có thể vì trình so sánh tùy chỉnh phải được gọi là n * log n lần, nhưng chức năng chính chỉ cần n cuộc gọi. – recursive

+0

Không biết điều đó. Cảm ơn đệ quy! – pboucher

10

Làm thế nào về:

lst.sort(key=lamdba s: s.split(' x ')[1]) 
+0

mẫu của bạn có lỗi đánh máy trong từ 'lambda' – r0101

1

Để làm như vậy, bạn cần phải thực hiện một phong tục so sánh:

def myCompare(x, y): 
    x_name = " ".join(x.split()[2:]) 
    y_name = " ".join(y.split()[2:]) 
    return cmp(x_name, y_name) 

Sau đó, bạn sử dụng để so sánh định nghĩa như là đầu vào vào chức năng sắp xếp của bạn:

myList.sort(myCompare) 
Các vấn đề liên quan