2012-03-03 32 views
7

Dường như PostgreSQL 8.4 và Ubuntu 10.04 không thể xử lý cách cập nhật để sắp xếp W và V cho bảng chữ cái Thụy Điển. Có nghĩa là, nó vẫn ra lệnh cho họ như cùng một lá thư như thế này (định nghĩa cũ để đặt hàng Thụy Điển):Sắp xếp danh sách các bộ dữ liệu xem xét địa phương (đặt hàng Thụy Điển)

  • Wa
  • Vb
  • Wc
  • VD

nó phải được (định nghĩa mới cho đặt hàng Thụy Điển):

  • Vb
  • VD
  • Wa
  • Wc

tôi cần phải đặt hàng này một cách chính xác cho một trang web Python/Django Tôi đang xây dựng. Tôi đã thử nhiều cách khác nhau để chỉ cần sắp xếp một danh sách các bộ dữ liệu được tạo từ một Django QuerySet bằng cách sử dụng * values_list *. Nhưng vì đó là tiếng Thụy Điển nên các chữ cái å, ä và ö cần được đặt đúng. Bây giờ tôi có một hoặc bên kia đường cả hai không phải cả hai ..

list_of_tuples = [(u'Wa', 1), (u'Vb',2), (u'Wc',3), (u'Vd',4), (u'Öa',5), (u'äa',6), (u'Åa',7)] 

print '########## Ordering One ##############' 
ordered_list_one = sorted(list_of_tuples, key=lambda t: tuple(t[0].lower())) 
for item in ordered_list_one: 
    print item[0] 

print '########## Ordering Two ##############' 
locale.setlocale(locale.LC_ALL, "sv_SE.utf8") 
list_of_names = [u'Wa', u'Vb', u'Wc', u'Vd', u'Öa', u'äa', u'Åa'] 
ordered_list_two = sorted(list_of_names, cmp=locale.strcoll) 
for item in ordered_list_two: 
    print item 

Các ví dụ cho:

########## Ordering One ############## 
Vb 
Vd 
Wa 
Wc 
äa 
Åa 
Öa 
########## Ordering Two ############## 
Wa 
Vb 
Wc 
Vd 
Åa 
äa 
Öa 

Bây giờ, những gì tôi muốn là một sự kết hợp của những cái mà cả V/W và å , ä, ö đặt hàng là chính xác. Để được chính xác hơn. Tôi muốn Đặt hàng một để tôn trọng ngôn ngữ. Bởi sau đó bằng cách sử dụng mục thứ hai (đối tượng id) trong mỗi tuple tôi có thể lấy đối tượng chính xác trong Django.

Tôi bắt đầu nghi ngờ rằng điều này sẽ có thể? Sẽ nâng cấp PostgreSQL lên phiên bản mới hơn xử lý collations tốt hơn và sau đó sử dụng SQL thô trong Django có thể?

+0

Tôi nghĩ rằng Postgres 8.4 và Ubuntu 10.04 LTS sẽ ổn.Miền của bạn được đặt thành cụm sao nào? Bạn có thể nói điều này bằng lệnh "show lc_collate;" –

+0

Tôi nên đề cập rằng miền địa phương là chính xác cho cụm (sv_SE). Tôi đã phải thay đổi điều này trước đó để có được å, ä và ö để được sắp xếp một cách chính xác. – daru

Trả lời

8

Khi chạy LC_ALL=sv_SE.UTF-8 sort trên ví dụ của bạn trên Ubuntu-10.04, nó xuất hiện với Wa trước Vb ("cách cũ"), vì vậy Ubuntu dường như không đồng ý với "cách mới". Vì PostgreSQL dựa vào hệ điều hành này, nó sẽ hoạt động giống như hệ điều hành được đưa ra cùng một lc_collate.

Có thực sự là một bản vá trong debian glibc liên quan đến vấn đề sắp xếp cụ thể này: http://sourceware.org/bugzilla/show_bug.cgi?id=9724 Nhưng nó đã được phản đối và không được chấp nhận. Nếu bạn chỉ cần hành vi này trên hệ thống bạn quản trị, bạn vẫn có thể áp dụng thay đổi bản vá cho/usr/share/i18n/locales/sv_SE và xây dựng lại miền địa phương se_SV bằng cách chạy locale-gen sv_SE.UTF-8. Hoặc tốt hơn, tạo ra miền địa phương thay thế của riêng bạn bắt nguồn từ nó để tránh rối tung với bản gốc.

+0

Có vẻ như tôi đang cố gắng giải quyết vấn đề ở cuối sai của chồng tôi đang sử dụng. Tôi có toàn quyền kiểm soát lưu trữ nên không có vấn đề gì khi sử dụng bản vá đó. Cảm ơn nhiều! – daru

0

Giải pháp này phức tạp vì khóa = locale.strxfrm hoạt động tốt với danh sách đơn và từ điển, nhưng không có danh sách danh sách hoặc danh sách bộ dữ liệu.

Thay đổi từ Py2 -> Py3: sử dụng locale.setlocale (locale.LC_ALL, '') và key = 'locale.strxfrm' (thay vì 'cmp = locale.strcoll').

list_of_tuples = [('Wa', 1), ('Vb',2), ('Wc',3), ('Vd',4), ('Öa',5), ('äa',6), ('Åa',7)] 

def locTupSorter(uLot): 
    "Locale-wise list of tuples sorter - works with most European languages" 
    import locale 
    locale.setlocale(locale.LC_ALL, '') # get current locale 

    dicTups = dict(uLot)   # list of tups to unsorted dictionary 
    ssList = sorted(dicTups, key=locale.strxfrm) 
    sLot = [] 
    for i in range(len(ssList)): # builds a sorted list of tups 
     tfLot =() 
     elem = ssList[i]   # creates tuples for list 
     tfLot = (elem, dicTups[elem]) 
     sLot.append(tfLot)  # creates sorted list of tuples 
    return(sLot) 


print("list_of_tuples=\n", list_of_tuples) 
sortedLot = locTupSorter(list_of_tuples) 
print("sorted list of tuples=\n",sortedLot) 
Các vấn đề liên quan