2012-05-18 12 views
6

Mam pytanie: Oto lista list tworzonych przez bibliotekę ElementTree.Niestandardowy python sortowania

[['word1', <Element tag at b719a4cc>], ['word2', <Element tag at b719a6cc>], ['word3', <Element tag at b719a78c>], ['word4', <Element tag at b719a82c>]] 

słowo1..4 może zawierać znaki Unicode, tj. (Â, ü, ç).

Chcę posortować listę list według mojego niestandardowego alfabetu.

wiem jak sortować według niestandardowych alfabetu stąd sorting words in python

wiem też, jak sortować według klucza stąd http://wiki.python.org/moin/HowTo/Sorting

Problem polega na tym, że nie mogę znaleźć sposób, jak zastosować te dwie metody sortowania mojej "listy list".

+1

Sztuk pytanie, jeśli kod dostarczony tyle, że możemy go uruchomić Założę ktoś będzie po prostu publikuj pełne rozwiązanie (szczególnie, jeśli opublikujesz to, co próbujesz). –

+0

Zgadzam się z Brianem, dodaj kod, który będziemy mogli skopiować i wkleić, a napisanie w pełni sprawnej odpowiedzi zajmie prawdopodobnie mniej niż 5 minut. –

+0

Hello! Mam jeszcze jeden problem. Jak dokonać sortowania ** wielkość liter nie ma znaczenia **? – microspace

Odpowiedz

13

Twój pierwszy link mniej lub więcej rozwiązuje problem. Trzeba tylko mieć funkcję lambda patrzeć tylko na pierwszej pozycji na liście:

alphabet = "zyxwvutsrqpomnlkjihgfedcba" 

new_list = sorted(inputList, key=lambda word: [alphabet.index(c) for c in word[0]]) 

jedną modyfikację mógłbym zasugerować, jeśli sortowania stosunkowo dużą listę, jest zmiana struktury alfabetu w dict po pierwsze, aby wyszukiwanie indeksu było szybsze:

alphabet_dict = dict([(x, alphabet.index(x)) for x in alphabet) 
new_list = sorted(inputList, key=lambda word: [alphabet_dict[c] for c in word[0]]) 
2

Jeśli dobrze rozumiem cię, chcesz wiedzieć, jak zastosować technikę sortowania kluczy, gdy klucz powinien dotyczyć elementu twojego obiektu. Innymi słowy, chcesz zastosować funkcję klucza do 'wordx', a nie do elementu ['wordx', ...], który faktycznie sortujesz. W tym przypadku można to zrobić:

my_alphabet = "..." 

def my_key(elem): 
    word = elem[0] 
    return [my_alphabet.index(c) for c in word] 

my_list.sort(key=my_key) 

lub stosując styl w pierwszym linku:

my_alphabet = "..." 
my_list.sort(key=lambda elem: [my_alphabet.index(c) for c in elem[0]]) 

Należy pamiętać, że będzie my_list.sort sortowane w miejscu, w rzeczywistości modyfikowanie listy. posortowane (my_list, ...) zwróci nową posortowaną listę.

+0

Tak, zrozumiałeś mnie poprawnie. Dziękuję Ci! Teraz rozumiem. – microspace

0

Działa świetnie !!! Dziękuję za pomoc Oto moja historia: Mam słownik turecko-rosyjski w formacie xdxf. Problem polegał na tym, żeby go posortować. Znalazłem rozwiązanie tutaj http://effbot.org/zone/element-sort.htm, ale nie sortowałem znaków Unicode. tutaj jest kod źródłowy końcowy: Treść

#!/usr/bin/env python 
# -*- coding: utf-8 -*- 
import xml.etree.ElementTree as ET 
import codecs 
alphabet = u"aâbcçdefgğhiıjklmnoöpqrstuüvwxyz" 
tree = ET.parse("dict.xml") 
# this element holds the phonebook entries 
container = tree.find("entries") 
data = [] 
for elem in container: 
    keyd = elem.findtext("k") 
    data.append([keyd, elem]) 
data.sort(key=lambda data: [alphabet.index(c) for c in data[0]]) 
container[:] = [item[-1] for item in data] 
tree.write("new-dict.xml", encoding="utf-8") 

próbka dict.xml

<cont> 
    <entries> 
<ar><k>â</k>def1</ar> 
<ar><k>a</k>def1</ar> 
<ar><k>g</k>def1</ar> 
<ar><k>w</k>def1</ar> 
<ar><k>n</k>def1</ar> 
<ar><k>u</k>def1</ar> 
<ar><k>ü</k>def1</ar> 
<ar><k>âb</k>def1</ar> 
<ar><k>ç</k>def1</ar> 
<ar><k>v</k>def1</ar> 
<ar><k>ac</k>def1</ar> 
    </entries> 
</cont> 

dziękujemy wszystkim

+0

Mmm. Mam jeszcze jeden problem. Jak sprawić, by sortowanie było niewrażliwe na wielkość liter? – microspace

Powiązane problemy