在Python 3中,如何将字符串数组按长度和字母顺序排序?

4
如何用Python按单词长度(从长到短)和字母表顺序对数组进行排序?
这是我的意思: 我有一个列表:WordsArray = ["Lorem", "ipsum", "dolor", "sit", "amet", "consectetur", "adipiscing", "elit", "sed", "do", "eiusmod", "tempor", "incididunt"] 我想输出这个列表:['consectetur', 'adipiscing', 'incididunt', 'eiusmod', 'tempor', 'dolor', 'ipsum', 'Lorem', 'amet', 'elit', 'sed', 'sit', 'do'] 我已经可以使用print(sorted(WordsArray))按字母顺序排序了。
['Lorem', 'adipiscing', 'amet', 'consectetur', 'do', 'dolor', 'eiusmod', 'elit', 'incididunt', 'ipsum', 'sed', 'sit', 'tempor']
3个回答

6
首先,仅使用“sorted”将不会按字母顺序排序,请查看您的输出... 我非常确定“L”不在“a”之前。您当前正在执行区分大小写的排序。
您可以通过使用键函数来执行不区分大小写的排序,如下所示:
>>> words_list = ["Lorem", "ipsum", "dolor", "sit", "amet", "consectetur", "adipiscing", "elit", "sed", "do", "eiusmod", "tempor", "incididunt"]
>>> sorted(words_list, key=str.lower)
['adipiscing', 'amet', 'consectetur', 'do', 'dolor', 'eiusmod', 'elit', 'incididunt', 'ipsum', 'Lorem', 'sed', 'sit', 'tempor']

您可以按照下面的方式修改关键函数,先按长度排序,然后按字母顺序排序:

>>> def custom_key(str):
...   return -len(str), str.lower()
... 
>>> sorted(words_list, key=custom_key)
['consectetur', 'adipiscing', 'incididunt', 'eiusmod', 'tempor', 'dolor', 'ipsum', 'Lorem', 'amet', 'elit', 'sed', 'sit', 'do']

解决方案有效,但有疑问。使用 lower 后,顺序为:..'dolor','ipsum'..,但不使用时,顺序为 ..'ipsum','dolor'..lower 如何在这里起作用? - Kaushik NP
@KaushikNP 抱歉,我不明白?如果您查看 OP 的代码,“dolor” 在“ipsum” 之前,并且在我的两个示例中也是如此。 - Sash Sinha
就像我说的,你的解决方案可行。在尝试一些变化时,我注意到了这种行为。 - Kaushik NP
1
>>> sorted(words_list, key=lambda x: (-len(x))) gives => ['consectetur', 'adipiscing', 'incididunt', 'eiusmod', 'tempor', 'Lorem', 'ipsum', 'dolor', 'amet', 'elit', 'sit', 'sed', 'do'] - Kaushik NP
2
@KaushikNP 你的意思是当你不按字母顺序排序时,它就不会按字母顺序排序?令人震惊。 - Stefan Pochmann

4

您可以使用一个元组作为键,该元组先指定字符串的负长度 -len(x),然后是字符串 x 本身:

sorted(WordsArray<b>, key=lambda x: (-len(x),x)</b>)

由于元组是按照第一个元素排序,若存在相同,则按照第二个元素排序以此类推。因此,我们首先通过比较两个字符串的 -len(x),即字符串长度的相反数来进行排序,这意味着较大的字符串排在前面。

如果两个字符串长度相同,则按字母顺序 x 进行比较。

请注意,排序两个字符串时区分大小写:Python将其按字典顺序排序,但是第一个字符的 ord(..) 指定了顺序等。如果想按字母顺序排序,则最好将大写字母和小写字母转换为相同的大小写。处理的快速方法是:

sorted(WordsArray, key=lambda x: (-len(x),x.<b>lower()</b>))

但是这并不总是正确的:例如,在德语中,est-zet有时会被翻译为ss等。实际上,在某些语言中按字母顺序排序是一个非常困难的问题。因此,在这种情况下,您需要指定排序规则


解决方案可行,但有疑问。使用 lower 后,顺序为:..'dolor', 'ipsum'..,但不使用时,顺序为 ..'ipsum', 'dolor'..lower 如何在这里起作用的? - Kaushik NP
@KaushikNP:因为并不是所有的文化/语言中都有“lower”的字符。判断两个字符串是否相等已经是一个棘手的问题了。例如在德国,“'Foostraße'”和“'Foostrasse'”经常被视为相同的文本。例如这里 - Willem Van Onsem
你说的是正确的。但我认为你没有理解我的问题。>>> sorted(words_list, key=lambda x: (-len(x))) 的输出结果是 => ['consectetur', 'adipiscing', 'incididunt', 'eiusmod', 'tempor', 'Lorem', 'ipsum', 'dolor', 'amet', 'elit', 'sit', 'sed', 'do']。然而,ipsumdolor 的顺序不应该这样。 - Kaushik NP
@KaushikNP:是的,但这就是为什么我们将x映射到一个2元组:(-len(x),x.lower())(所以如果两个-len(x)相等,Python将对元组的第二个元素x.lower()执行比较)。 - Willem Van Onsem
哦,好的。否则就没有比较了?嗯,明白了。 - Kaushik NP

0

对于我的情况:

A = [a_12,a_3,a_11]

sorted(A, key=lambda x: (len(x),x))

[a_3, a_11, a_12]


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接