Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
自定义排序python_Python_Sorting - Fatal编程技术网

自定义排序python

自定义排序python,python,sorting,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字符,即(–、ü、ç) 我想按我的

我有一个问题: 这是列表列表,由ElementTree库组成

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

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

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

我知道如何从这里按自定义字母表排序

我也知道如何从这里按键排序


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

如果我理解正确,您想知道当键应该应用于对象的元素时,如何应用键排序技术。换句话说,您希望将key函数应用于'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将在适当的位置进行排序,实际上会修改您的列表。排序(my_list…)将返回一个新的排序列表。

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

工作很好!!!谢谢你的帮助 以下是我的故事: 我有xdxf格式的土耳其语俄语词典。问题是如何分类。 我在这里找到了解决方案,但它没有对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>

–def1
adef1
gdef1
wdef1
ndef1
udef1
üdef1
B-bdef1
çdef1
vdef1
acdef1

感谢所有的

好问题,如果你提供了足够的代码,我们可以运行它,我打赌有人会发布一个完整的解决方案(特别是如果你发布了你尝试过的解决方案)。我同意Brian的观点,添加一些代码,我们可以复制和粘贴,可能需要不到5分钟的时间来编写一个完整的答案。您好!我还有一个问题。如何使排序不区分大小写?您可以尝试将lambda函数中的c更改为c.lower(),这将把字符转换为小写。但这可能不适用于您的角色集。如果没有,您可以使用连续的大写和小写字符列出字母表-例如“AaBcCc…”,然后将lambda函数更改为返回int(alphabet.index(c)/2),该函数应将列表中的每对相邻字符映射到相同的优先级。(alphabet.index(c)/2)是一个很好的解决方案,但对于a、e、,我和我有一些特殊的变音字母,例如:字母表=u'aáa–bBcCçdDe EfFgGĞhHiîÎīijkkllmnnóoOÖpPqQrRsSşttuuuÛÜvwxxyzz。怎么对付他们?非常感谢。