Python - 在包含字符串和数字的列表中订购数字值

时间:2015-12-15 12:02:40

标签: python list sorting

我创建了一个列表,其中包含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

3 个答案:

答案 0 :(得分:2)

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]]。应该是一个列表,用于连接数字字符串列表。

答案 1 :(得分:0)

使用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

答案 2 :(得分:0)

您也可以通过这种方式解决问题。我首先将所有等级转换为整数类型,以便我可以保持我的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)