【问题标题】:Python - Sorting a list of strings (names and scores) from highest to lowestPython - 从最高到最低对字符串(名称和分数)列表进行排序
【发布时间】:2016-03-19 19:04:51
【问题描述】:

假设我有这个名字和分数列表:

scores_list = ["Username1,9,5,6", "Username2,7,6,8", "Username3,10,10,7"]

列表中的每个值的格式为 -Name-Score1-Score2-Score3-

我将如何对这个列表进行排序,以便在过去 3 个结果中得分最高的用户排在第一位,一直到最后得分最低。

所以,在这种情况下,我希望它像这样排序

("Username3,10,10,7", "Username1,9,6,5", "Username2,8,7,6") 

因为 10 是最大的,然后是 9,然后是 8。

所以,本质上,我需要将三个分数从高到低按顺序排列,然后列表中每个值的最高分也从高到低排列。

也许我需要为列表中的每个值赋予其自己的索引,以便它是一个二维列表?

感谢您的帮助。

【问题讨论】:

标签: python string list numbers integer


【解决方案1】:

如果您是从文件中读取此内容,则最好使用 csv 模块来解析数据:

from csv import reader
with open("your_file") as f:
      srt = sorted(([row[0]] + sorted(map(int, row[1:]), reverse=1) for row in reader(f)), reverse=1)
      for row in srt:
          print(row)

输出:

['Username3', 10, 10, 7]
['Username2', 8, 7, 6]
['Username1', 9, 6, 5]

如果您打算使用数据,那么将其分开将使生活变得更轻松。

完成数据后,您可以使用csv.writer 重写到文件:

with open("your_file","w") as out:
      wr = csv.writer(out)
      wr.writerows(srt)

这会给你:

Username3,10,10,7
Username2,8,7,6
Username1,9,6,5

【讨论】:

  • 这是一种排序方式:P。现在我觉得 OP 不清楚如何对其进行排序。
  • @VigneshKalai,OP 实际上也需要对每一行进行排序
  • 是的,一切都是从他的输出中隐含的。因此,如果没有他提供的更多信息,我们无法得出结论。
【解决方案2】:

首先,使用一个函数将每个元素(如Username1,9,5,6)转换为一个列表,如["Username1",9,5,6]。同时对三个分数进行排序,每个元素的最终形式如["Username1",9,6,5],然后对传输的数据进行排序。最后,连接排序列表的列表元素

scores_list = ["Username1,9,5,6", "Username2,7,6,8", "Username3,10,10,7"]
def transfer(x):
    items = x.split(",")
    result = [items[0]] + sorted(map(int,items[1:]), reverse = True)
    return result

transfered = map(transfer,scores_list)
transfered.sort(key=lambda x:x[1], reverse = True)

result = [",".join(map(str,x)) for x in transfered]
print result

>>>output:
['Username3,10,10,7', 'Username1,9,6,5', 'Username2,8,7,6']

【讨论】:

    【解决方案3】:

    您首先需要拆分每个条目并按数字对分数进行排序。然后可以重新组合生成的列表以创建更新后的scores_list,如下所示:

    scores_list = ["Username1,9,5,6", "Username2,7,6,8", "Username3,10,10,7"]
    output = []
    
    for entry in scores_list:
        values = entry.split(',')
        output.append([values[0], sorted([int(x) for x in values[1:]], reverse=True)])
    
    scores_list = ['{},{}'.format(entry[0], ','.join(str(x) for x in entry[1])) for entry in sorted(output, key=lambda x: x[1], reverse=True)]
    print scores_list
    

    这将显示以下内容:

    ['Username3,10,10,7', 'Username1,9,6,5', 'Username2,8,7,6']
    

    【讨论】:

    • 既然可以使用普通的key 属性来完成这一切,为什么还要这样做
    • 由于字符串本身也需要排序,特别是Username1和Username2的顺序不对。
    • 好的:)。如果这就是 OP 想要的,那么我的答案是错误的:P
    【解决方案4】:

    使用sorted or .sort methodkey 属性排序

    代码:

    scores_list = ["Username1,920,5,6", "Username2,10,11,8", "Username3,10,10,7"]
    def transform(lst):
        return map(int, lst.split(",")[1:])
    print sorted(scores_list, key= transform ,reverse=True)
    

    输出:

    ['Username3,10,10,7', 'Username1,9,5,6', 'Username2,7,6,8']
    

    注意事项:

    • 我们在 sorted 的 key 属性上调用 tranform 函数
    • 在转换函数中,我们在, 处滑动并将它们转换为整数列表并将其提供给键

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-05-03
      • 1970-01-01
      • 1970-01-01
      • 2011-08-21
      • 1970-01-01
      • 1970-01-01
      • 2015-08-22
      • 2016-07-03
      相关资源
      最近更新 更多