自定义排序python

时间:2012-05-18 02:25:57

标签: python sorting

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

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

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

我想按自定义字母排序这个列表列表。

我知道如何从这里按自定义字母排序 sorting words in python

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

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

3 个答案:

答案 0 :(得分:14)

您的第一个链接或多或少解决了问题。你只需要让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]])

答案 1 :(得分: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,...)将返回一个新的排序列表。

答案 2 :(得分: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>

感谢所有