【问题标题】:Sort by name and rank按名称和排名排序
【发布时间】:2012-08-13 21:56:03
【问题描述】:

所以前段时间我在这里问了这个问题:Sorting lists in python

我这里有这段代码:

def sort(names, rank):
    lst=[]
    for x in range(0, len(names)):
        lst.append((int(rank[x]), names[x]))
    lst.sort(key=lambda x: (-x[0],len(x[1])) )
    newArr = []
    for z in range(0, len(lst)):
        row = lst[z]
        newArr.append(row[1] + " " + str(row[0]))
    return newArr

但我还需要对名称进行更多排序,如果名称的长度相同,我需要以大写字母排在第一位。有什么想法吗?

【问题讨论】:

  • 给您的风格提示:将 for z in range(0, len(lst)) 替换为 for row in lst。更简单,更易读。
  • 是的,我已经开始这样做了 xD

标签: python sorting


【解决方案1】:

在第三个条件的元组中添加另一个条目。

def sort(names, rank):
    lst=[]
    for x in range(0, len(names)):
        lst.append((int(rank[x]), names[x]))
    lst.sort(key=lambda x: (-x[0],len(x[1]), ord(x[1][0])) )
    newArr = []
    for z in range(0, len(lst)):
        row = lst[z]
        newArr.append(row[1] + " " + str(row[0]))
    return newArr

我重写了你的代码,做了一些风格上的改变:

def sort(names, rank):
    lst=[]
    for index, name in enumerate(names):
        lst.append((int(rank[index]), name))
    lst.sort(key=lambda x: (-x[0],len(x[1]),  ord(x[1][0])))
    output = []
    for row in lst:
        output.append(row[1] + " " + str(row[0]))
    return output

我个人认为第二种方法更具可读性。

【讨论】:

  • sort(["fabian", "Fabian", "bob"],["1", "1", "2"]) 在Fabian 之前仍然出现fabian
  • 将x[1] 替换为x[1][0]。
  • 是的,刚刚想通了。谢谢马克。
  • 与其使用is_capital 函数,不如使用内置的ord 函数?例如key=lambda x: (-x[0], len(x[1]), ord(x[1][0])) 这将仅按首字母按字母顺序排序。 (当然,你也可以(-x[0], len(x[1]), x[1])...)
  • 我忘记了 ord() 函数。谢谢。
猜你喜欢
  • 1970-01-01
  • 2013-07-21
  • 2018-03-26
  • 1970-01-01
  • 1970-01-01
  • 2014-09-19
  • 2018-11-02
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多