我有一个问题: 这是由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
问题是我找不到如何应用这两种方法来对我的“列表列表”进行排序的方法。
答案 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>
感谢所有