【问题标题】:Python - Ordering Number Values in a List Containing Strings and NumbersPython - 对包含字符串和数字的列表中的数字值进行排序
【发布时间】:2015-12-15 20:39:11
【问题描述】:

我创建了一个列表,其中包含来自 python 分数文件的所有信息。

分数 .txt 文件:

Dan Danson,9,6,1
John Johnson,5,7,10
Mike Mikeson,10,7,6

我这样做是为了将 .txt 文件中的信息放入 2d 列表中:

f = open(filename, 'r')
lines = f.readlines()
f.close()

scores = []
for line in lines: #Loads lines into a 2d list
    currentline = line.strip('\n').split(",")
    scores.append(currentline)

现在我有了这个清单:

[['Dan Danson', '1', '6', '9'], ['John Johnson', '5', '7', '10'], ['Mike Mikeson', '10', '7', '6']]

从这个列表中,我想对列表中的数字进行排序,以便它们从最高到最低排序,所以我得到一个看起来像这样的列表:

[['Dan Danson', '9', '6', '1'], ['John Johnson', '10', '7', '5'], ['Mike Mikeson', '10', '7', '6']]

最后我希望能够打印从高到低排序的列表。

Mike Mikeson,10,7,6
John Johnson,10,7,5
Dan Danson,9,6,1

【问题讨论】:

  • 你需要将你的数字从字符串中分离出来......也许做一个关联数组并将你的名字作为它的键。在python中查找字典,看看是否有帮助..

标签: python list sorting


【解决方案1】:

使用sortedint 作为键函数:

>>> rows = [
...     ['Dan Danson', '1', '6', '9'],
...     ['John Johnson', '5', '7', '10'],
...     ['Mike Mikeson', '10', '7', '6'],
... ]
>>>
>>> rows = [row[:1] + sorted(row[1:], key=int, reverse=True) for row in rows]
>>> sorted(rows, key=lambda row: sum(map(int, row[1:])), reverse=True)
[['Mike Mikeson', '10', '7', '6'],
 ['John Johnson', '10', '7', '5'],
 ['Dan Danson', '9', '6', '1']]
  • sorted(row[1:], ..):单独的数值和排序。
  • row[:1]:名称作为列表,或者您可以使用[row[0]]。应该是要连接到数字字符串列表的列表。

【讨论】:

  • 谢谢,但是我如何对列表进行排序,以便“高分”最高的名称位于顶部(列表的第一个元素)。如果两个人的高分是 10,我想比较他们的第二高分,看看谁更高,如果相同,比较他们的第三高分,得到我放在帖子底部的最终输出。干杯。
  • @Tizer1000,您需要另一个sortlambda row: sum(map(int, row[1:])) 才能获得总数。
  • 你能编辑上面的代码来显示这个吗?谢谢!
  • @Tizer1000,我更新了答案。对不起,我错过了开头的最后一部分。感谢您的反馈。
【解决方案2】:

使用sortedmap 将字符串转换为整数:

>>> l = [['Dan Danson', '9', '6', '1'], ['John Johnson', '10', '7', '5'], ['Mike Mikeson', '10', '7', '6']]
>>> for e in l:
...     print(e[0], *sorted(list(map(int, e[1:]))))
...     
... 
Dan Danson 1 6 9
John Johnson 5 7 10
Mike Mikeson 6 7 10

【讨论】:

    【解决方案3】:

    您也可以通过这种方式解决问题。我首先将所有等级转换为整数类型,以便我可以保持我的 lambda 函数干净。我本可以在 lambda 函数中完成转换,但它并不喜欢我。

    您可以看到将每个问题拆分为不同的模块,从而提供可重用性。

    test = [['Dan Danson', '1', '6', '9'], ["Karthikeyan", 10, 10, 10], ['John Johnson', '5', '7', '10'], ['Mike Mikeson', '10', '7', '6']]
    
    def covert_to_integer(test):
        """
        Coverting all grades into integer type
        """
        for outer_index, item in enumerate(test):
            for inner_index, element in enumerate(item[1:], 1):
                test[outer_index][inner_index] = int(element)
        return sorting_by_sum(test)
    
    def sorting_by_sum(test):
        """
        Sorting the records by sum of the grades. 
        """
        return sorted(test, key=lambda record: record[1]\
                                       + record[2] \
                                       + record[3], reverse=True)
    
    if __name__ == "__main__":
        print covert_to_integer(test)
    

    你甚至可以在 lambda 函数中使用 list 的 sum 方法。像这样:

    return sorted(test, key=lambda record: sum(record[1:])\
                                       ,reverse=True)
    

    【讨论】:

      猜你喜欢
      • 2021-08-12
      • 2016-01-23
      • 2021-02-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多