繁体   English   中英

忽略大写/小写的字符串排序列表

[英]Sort list of strings ignoring upper/lower case

我有一个列表,其中包含表示动物名称的字符串。 我需要对列表进行排序。 如果我使用sorted(list) ,它将首先给出带有大写字符串的列表输出,然后是小写的。

但我需要以下输出。

输入:

var = ['ant','bat','cat','Bat','Lion','Goat','Cat','Ant']

输出:

['ant', 'Ant', 'bat', 'Bat', 'cat', 'Cat', 'Goat', 'Lion']

sort()方法和sorted()函数接受一个关键参数:

var.sort(key=lambda v: v.upper())

对每个值调用key命名的函数,排序时使用返回值,不影响实际值:

>>> var=['ant','bat','cat','Bat','Lion','Goat','Cat','Ant']
>>> sorted(var, key=lambda v: v.upper())
['ant', 'Ant', 'bat', 'Bat', 'cat', 'Cat', 'Goat', 'Lion']

要在ant之前对Ant进行排序,您必须在键中包含更多信息,以便其他相等的值按给定顺序排序:

>>> sorted(var, key=lambda v: (v.upper(), v[0].islower()))
['Ant', 'ant', 'Bat', 'bat', 'Cat', 'cat', 'Goat', 'Lion']

更复杂的密钥生成('ANT', False)用于Ant ,和('ANT', True)用于ant ; True排在False之后,因此大写单词排在小写字母之前。

有关更多信息,请参阅Python 排序 HOWTO

Python 3 的新答案,我想补充两点:

  1. 使用str.casefold进行不区分大小写的比较。
  2. 直接使用该方法而不是在 lambda 内部使用。

那是:

var = ['ant','bat','cat','Bat','Lion','Goat','Cat','Ant']

var.sort(key=str.casefold)

(就地排序)现在:

>>> var
['ant', 'Ant', 'bat', 'Bat', 'cat', 'Cat', 'Goat', 'Lion']

或者,要返回一个新列表,请使用sorted

>>> var = ['ant','bat','cat','Bat','Lion','Goat','Cat','Ant']
>>> sorted(var, key=str.casefold)
['ant', 'Ant', 'bat', 'Bat', 'cat', 'Cat', 'Goat', 'Lion']

为什么这与str.lowerstr.upper不同? 根据文档:

Casefolding 类似于小写,但更具侵略性,因为它旨在消除字符串中的所有大小写区别。 例如,德语小写字母'ß'等效于"ss" 因为它已经是小写的, str.lower()不会对'ß'做任何事情; casefold()将其转换为"ss"

我需要添加另一个答案,因为接受的答案和较新的版本都缺少一件重要的事情

这里建议的不区分大小写的排序在“相等”键的排序中不稳定

这意味着:当您想要排序混合大小写字符串时,您会得到一个正确排序的列表,但不确定“AbC”是在“aBc”之前还是之后。 这甚至可能因同一程序的运行而异。

为了始终具有相同的输出和稳定的默认字符串排序,我使用以下函数:

sorted(var, key=lambda v: (v.casefold(), v))

这样,当 casefold 版本不提供差异进行排序时,原始键始终作为后备排序附加。

我们可以根据Python Sorting HOW TO文档使用'sorted'函数。

a = sorted(Input, key=str.lower)print("Output1: ",a)

输出1:

['ant', 'Ant', 'bat', 'Bat', 'cat', 'Cat', 'Goat', 'Lion']

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM