假设我有一个 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 "]
它会忽略空格,但不区分大小写。我尝试将这两种解决方案结合起来,但无法使其发挥作用。有没有办法轻松解决这个问题并“合并”两个结果?
str.strip()
删除字符串开头和结尾的空格,并使用 str.casefold()
进行无大小写排序。
lst = [" banana ", "Cherry", "apple"]
res = sorted(lst, key=lambda x: x.strip().casefold())
print(res)
输出:
['apple', ' banana ', 'Cherry']
只需链接调用即可
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()))
一个较旧的问题,但我想提供一个替代答案以供将来参考,该答案使用 PyICU 代替,并且可以与任何支持的语言环境一起使用,使其成为更灵活的解决方案。
使用基于 Unicode 的排序规则,可以通过多种方式定制排序规则。空白是可变的排序规则元素,可以有选择地更改它们的处理方式。可以改变它们的排序权重,并以四进制强度而不是主要强度来处理它们。这将启用 OP 所需的必要排序行为。
我们将:
可以构建一个 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)