Python:排序字符串列表,首先全部大写

时间:2017-08-18 17:00:39

标签: python string list sorting case

如何对字符串列表进行排序,以便开始字符串的大写数量是主要标准?

我有什么:

names = ["JOE", "Kate", "WILfried", "alfred", "denis"]

print sorted(names)

>>> ['JOE', 'Kate', 'WILfried', 'alfred', 'denis']

我想要的是什么:

>>> ['JOE', 'WILfried', 'Kate', 'alfred', 'denis']

修改

换句话说,我想:

  • 在第一个位置,排序以 n 大写字母
  • 开头的字符串
  • 然后,排序以 n-1 大写字母
  • 开头的字符串
  • “”“”“”“”“”“”“”“”“”“”“”“”“” n-2 “”“”“”

(跟随至少一个小写角色的首都并不重要。)

3 个答案:

答案 0 :(得分:3)

您可以使用:

print(sorted(names,key = lambda x: (not x.isupper(), x)))
>>> ['JOE', 'WILFRIED', 'Kate', 'alfred', 'denis']

更新:

...

答案 1 :(得分:3)

以下功能满足要求

l = ['JOE', 'Kate', 'WILfried', 'alfred', 'denis']
def k(x):
  for i,j in enumerate(x):
    if j.islower():
      return (-i,x)
  return (-len(x),x)

print(sorted(l,key=k))

这给出了以下输出:

['JOE', 'WILfried', 'Kate', 'alfred', 'denis']

函数k对出现在字符串开头的大写字母数量进行加权 编辑:感谢@jdeseha进行编辑

答案 2 :(得分:2)

这是一个(有点难看)的解决方案:

names = ['JOE', 'Kate', 'WILfried', 'alfred', 'denis']
k = lambda s: ([-i for i, u in enumerate(map(str.isupper, s)) if not u] or [-len(s)],
               s.lower())
print sorted(names, key=k)
>>> ['JOE', 'WILfried', 'Kate', 'denis', 'alfred']

也许你想把lambda作为一个正确的功能。