2010-03-22 30 views
5

Tôi có thể sắp xếp danh sách các bộ dữ liệu một cách hiệu quả và dễ dàng như thế nào mà không cần nhạy cảm với trường hợp?Sắp xếp danh sách các bộ dữ liệu không có phân biệt chữ hoa chữ thường

Ví dụ này:

[('a', 'c'), ('A', 'b'), ('a', 'a'), ('a', 5)] 

nên trông như thế này một lần sắp xếp:

[('a', 5), ('a', 'a'), ('A', 'b'), ('a', 'c')] 

Các loại tự từ điển thường xuyên sẽ đưa 'A' trước khi 'a' và mang lại điều này:

[('A', 'b'), ('a', 5), ('a', 'a'), ('a', 'c')] 

Trả lời

10

Bạn có thể sử dụng đối số sort 's key để xác định cách bạn muốn coi mỗi yếu tố liên quan đến sắp xếp:

def lower_if_possible(x): 
    try: 
     return x.lower() 
    except AttributeError: 
     return x 

L=[('a', 'c'), ('A', 'b'), ('a', 'a'), ('a', 5)] 

L.sort(key=lambda x: map(lower_if_possible,x)) 
print(L) 

Xem http://wiki.python.org/moin/HowTo/Sorting cho một lời giải thích về cách sử dụng key.

+0

mát, tôi đã cố gắng tìm ra cách sử dụng khóa trong tình huống này và việc sử dụng map() không xảy ra với tôi. Cảm ơn! –

0

Something như thế này nên làm việc:

def sort_ci(items): 
    def sort_tuple(tuple): 
     return ([lower(x) for x in tuple],) + tuple 
    temp = [sort_tuple(tuple) for tuple in items] 
    temp.sort() 
    return [tuple[1:] for tuple in temp] 

Nói cách khác, tạo ra một danh sách mới, trong đó mỗi mục là một tuple bao gồm các tuple cũ, bắt đầu bằng các tuple cùng với mỗi mục trong trường hợp thấp hơn. Sau đó sắp xếp điều đó.

Điều này nhanh hơn một chút so với đối số chức năng so sánh tùy chọn sort, nếu danh sách của bạn dài.

2
list_of_tuples.sort(key=lambda t : tuple(s.lower() if isinstance(s,basestring) else s for s in t)) 
+0

Giải pháp nhỏ gọn, đẹp mắt. Cảm ơn! –

+0

Nếu các bộ dữ liệu của bạn có thể chứa các bộ hoặc cấu trúc trình tự khác, có thể bạn sẽ muốn giải pháp lower_if_possible, được bao bọc bên trong một người gọi đệ quy được gọi là lower_sequence, gọi chính nó nếu nó tìm thấy một thành viên. – PaulMcG

0

Dưới đây là một giải pháp trong đó sử dụng các ý tưởng trang trí minh họa trong "được sắp xếp theo chìa khóa" của một bài báo Python wiki (http://wiki.python.org/moin/HowTo/Sorting/).

# Create a list of new tuples whose first element is lowercase 
# version of the original tuple. I use an extra function to 
# handle tuples which contain non-strings. 
f = lambda x : x.lower() if type(x)==str else x 
deco = [(tuple(f(e) for e in t), t) for t in ex] 

# now we can directly sort deco and get the result we want 
deco.sort() 

# extract the original tuples in the case-insensitive sorted order 
out = [t for _,t in deco] 
0

Một phiên bản đơn giản của Paul McGuires hoạt động:

list_of_tuples.sort(key=lambda t : tuple(t[0].lower())) 

(trong đó t [0] tài liệu tham khảo mà yếu tố tuple bạn muốn sử dụng, trong trường hợp này là người đầu tiên)

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