【问题标题】:Python : sorting a list of strings, all capitalized first [closed]Python:对字符串列表进行排序,首先全部大写[关闭]
【发布时间】:2017-08-18 17:00:38
【问题描述】:

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

我有什么:

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

print sorted(names)

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

我想要什么:

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

编辑

换句话说,我想:

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

(至少一个小写字符后的大写无关紧要。)

【问题讨论】:

  • 什么意思?贾斯汀B
  • “Kate”肯定应该排在“WILFRIED”之前吗?如果不是,请更仔细地解释您的排序规则。
  • Adi C:默认排序将“Kate”放在“JOE”和“WILfried”之间,但我希望在第一个位置有更多大写字母的字符串。

标签: python string list sorting case


【解决方案1】:

以下功能满足要求

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 的编辑

【讨论】:

  • 我会使用not j.isupper()(如果有数字或符号),只需将return放在for之后(请注意,如果您的函数可能返回None,例如, 参数以数字结尾。而且浮动的强制转换似乎没有必要。
  • 它只是工作 :) 非常感谢你 :)
【解决方案2】:

你可以使用:

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

更新:

...

【讨论】:

  • 它将失败 ['JOE', 'WILfried', 'Kate', 'alfred', 'denis']
  • 可能希望这是lambda x: (not x.isupper(), x),用于原始列表未按排序顺序排列的情况。
  • @taalf 查看我上面的评论是否适合该输入
  • 你说得对 Rajan... PRMoureu 我更新了这个问题,因为是的,我们的目标是有一些通用的东西。
  • @RajanChauhan 感谢您指出这种情况
【解决方案3】:

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

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 作为一个适当的函数。

【讨论】:

  • 现已修复(希望如此!)
  • 嗯,刚刚意识到,这产生的顺序是:首先每个全大写字符串,然后按初始大写数量排序(直到没有初始大写)。不确定这是否可以,或者应该仅按初始大写数量排序。
  • 做我需要的。非常感谢您的努力。如果我遇到未处理的情况,将对其进行调整,但这是一个非常好的开始。谢谢!
  • 啊...拉詹的回答尊重大写的数量...所以我会验证这个。不过,谢谢你的帮助:)
  • @taalf 是的,我做了一个小的编辑来模拟相同的行为......这与 Rajan 的答案大致相同,尽管他的答案可能更清晰(理论上,效率更高,因为它在每个字符串的第一个非大写字母处停止)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-08
  • 2010-10-08
  • 1970-01-01
  • 2023-03-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多