8

我有一个问题:这是由 ElementTree 库形成的列表列表。

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

word1..4 可能包含 unicode 字符,即 (â,ü,ç)。

我想按我的自定义字母表对这个列表列表进行排序。

我知道如何从这里按自定义字母 排序,在 python 中排序单词

我也知道如何从这里按键排序http://wiki.python.org/moin/HowTo/Sorting

问题是我找不到如何应用这两种方法对我的“列表列表”进行排序的方法。

4

3 回答 3

19

您的第一个链接或多或少地解决了问题。您只需要让 lambda 函数只查看列表中的第一项:

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]])
于 2012-05-18T03:16:51.727 回答
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, ...) 将返回一个新的排序列表。

于 2012-05-18T03:14:39.543 回答
0

效果很好!!!感谢您的帮助这是我的故事:我有 xdxf 格式的土耳其-俄语词典。问题是对它进行排序。我在这里找到了解决方案http://effbot.org/zone/element-sort.htm但它没有对 unicode 字符进行排序。这是最终的源代码:

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

感谢所有人

于 2012-05-18T17:21:54.273 回答