如何同时使用两个条件对Python中的字符串列表进行排序?

问题描述 投票:0回答:3

假设我有一个 Python 字符串列表:

list = ["   banana   ", "Cherry", "apple"]

我想将此列表排序为不区分大小写并忽略空格。就像这样:

list = ["apple", "   banana   ", "Cherry"]

如果我用这个:

sorted(list, key=str.casefold)

我明白了:

list = ["   banana   ", "apple", "Cherry"]

不区分大小写,但空格字符位于字母之前。

如果我用这个:

sorted(list, key=lambda x:x.replace(' ', ''))

我明白了:

list = ["Cherry", "apple", "   banana   "]

它会忽略空格,但不区分大小写。我尝试将这两种解决方案结合起来,但无法使其发挥作用。有没有办法轻松解决这个问题并“合并”两个结果?

python string list sorting
3个回答
4
投票

您可以使用

str.strip()
删除字符串开头和结尾的空格,并使用
str.casefold()
进行无大小写排序。

lst = ["   banana   ", "Cherry", "apple"]

res = sorted(lst, key=lambda x: x.strip().casefold())

print(res)

输出:

['apple', '   banana   ', 'Cherry']

3
投票

只需链接调用即可

values = ["   banana   ", "Cherry", "apple"]
print(sorted(values, key=lambda x: x.replace(' ', '').casefold()))
# ['apple', '   banana   ', 'Cherry']

仅丢弃开头和结尾的空格,我建议

str.strip

print(sorted(values, key=lambda x: x.strip().casefold()))

0
投票

一个较旧的问题,但我想提供一个替代答案以供将来参考,该答案使用 PyICU 代替,并且可以与任何支持的语言环境一起使用,使其成为更灵活的解决方案。

使用基于 Unicode 的排序规则,可以通过多种方式定制排序规则。空白是可变的排序规则元素,可以有选择地更改它们的处理方式。可以改变它们的排序权重,并以四进制强度而不是主要强度来处理它们。这将启用 OP 所需的必要排序行为。

我们将:

  1. 创建 PyICU Locale 对象
  2. 创建一个整理器实例
  3. 使用整理器排序键对列表进行排序

可以构建一个 ICU 语言环境,使用 BCP-47 U 扩展来定制该语言环境的排序规则的各个方面。

ka
子标签允许我们控制如何处理可变排序规则元素。对于交替换档,我们使用
-u-ks-shifted
。我们还可以使用
kv
子标签来限制哪些字符被移动。

所需的语言标签是

en-u-ks-shifted-kv-space

import icu
fruit = ["   banana   ", "Cherry", "apple"]
locale = icu.Locale.forLanguageTag('en-u-ka-shifted-kv-space')
collator = icu.Collator.createInstance(locale)
sorted_data = sorted(fruit, key=collator.getSortKey)
print(sorted_data)
© www.soinside.com 2019 - 2024. All rights reserved.