Вопрос по sorting, python – Пользовательская сортировка питона

6

У меня вопрос: Это список списков, сформированных библиотекой ElementTree.

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

word1..4 может содержать символы Юникода, т. е. (& # xE2;, & # xFC;, & # xE7;).

I want to sort this list of lists by my custom alphabet.

Я знаю, как сортировать по алфавиту отсюда сортировка слов в питоне

Я также знаю, как сортировать по ключу отсюдаhttp://wiki.python.org/moin/HowTo/Sorting

Проблема заключается в том, что я не смог найти способ применения этих двух методов для сортировки моего «списка списков».

Я согласен с Брайаном, добавьте немного кода, который мы можем скопировать и вставить, и, возможно, кому-то понадобится менее 5 минут, чтобы написать полностью рабочий ответ. John La Rooy
Хороший вопрос: если вы предоставите достаточно кода, чтобы мы могли его запустить, держу пари, что кто-то просто опубликует полное решение (особенно, если вы опубликуете то, что вы пробовали). Brian Larsen
Здравствуйте! У меня есть еще одна проблема. Как сделать сортировкуcase insensitive? microspace
Вы можете попробовать изменить c в лямбда-функции на c.lower (), которая преобразует символ в нижний регистр. Но это может не сработать для вашего набора символов. Если это не так, вы можете перечислить алфавит с последовательными прописными и строчными буквами - например, & quot; AaBcCc ... & quot ;, а затем измените лямбда-функцию, чтобы она возвращала int (alphabet.index (c) / 2), который должен сопоставлять каждую пару смежных символов в вашем списке с одинаковым приоритетом. happydave
(alphabet.index (c) / 2) - хорошее решение, но для a, e, i и o у меня есть несколько специальных диалектических букв, например: Alpha = u & reg; ; BBCC & # xE7; & # xC7; DDE & # xE9; EfFgG & # x11F; & # x11E; Hhi & # x130; & # Xee; & # xCE; & # XED; & # x12B; & # X131; IjJkKlLmMnN & # xF3; оо & # XF6; & # xD6; pPqQrRsS & # x15F; & # x15E; tTuU & # XFB; & # XFA; & # XDB; & # XFC; & # XDc; vVwWxXyYzZ. Как справиться с ними? благодарю вас. microspace

Ваш Ответ

3   ответа
0

Вот моя история: У меня есть турецко-русский словарь в формате xdxf. проблема заключалась в том, чтобы разобраться в этом. Я нашел решение здесьhttp://effbot.org/zone/element-sort.htm но он не сортировал символы Юникода. вот окончательный исходный код:

#!/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")

пример содержимого файла 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>

Спасибо всем

2

вы хотите знать, как применять метод сортировки ключей, когда ключ должен применяться к элементу вашего объекта. Другими словами, вы хотите применить функцию ключа к «wordx», а не к элементу [«wordx», ...], который вы фактически сортируете. В этом случае вы можете сделать это:

my_alphabet = "..."

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

my_list.sort(key=my_key)

или используя стиль в вашей первой ссылке:

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

Имейте в виду, что my_list.sort будет сортировать на месте, фактически изменяя ваш список. sorted (my_list, ...) вернет новый отсортированный список.

14

чтобы лямбда-функция смотрела только на первый элемент в вашем списке:

alphabet = "zyxwvutsrqpomnlkjihgfedcba"

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

Одна из модификаций, которые я могу предложить, если вы сортируете достаточно большой список, состоит в том, чтобы сначала преобразовать структуру алфавита в dict, чтобы поиск по индексу выполнялся быстрее:

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]])

Похожие вопросы