2015-12-15 7 views
3

Я создал список, содержащий всю информацию из файла оценок в python.Python - Значения порядкового номера в списке, содержащем строки и цифры

Счеты .txt файл:

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

Я сделал это, чтобы получить информацию из текстового файла в 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']] 

Из этого списка я хотел бы сортировать числа в списке, чтобы они упорядочивались от наивысшего до самого низкого, поэтому я получаю lis t, который выглядит примерно так:

[['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 
+0

вам нужно изолировать свои номера от строки ... возможно, сделать ассоциативный массив, чтобы ваше имя было ключевым. Посмотрите на словарь в python и посмотрите, помогает ли он. – SZD

ответ

2

Использование sorted с int как ключевой функции:

>>> 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]]. Должен быть список, который будет объединен в список строк чисел.
+0

Спасибо, но как мне тогда заказать список, чтобы имя с наивысшим «высоким счетом» было наверху (1-й элемент списка). Если у двух народов высокие баллы - 10, я хочу сравнить их 2-й самый высокий балл, чтобы узнать, кто идет выше, и если это то же самое сравнение, что и их 3-й балл, чтобы получить окончательный результат, я поставил внизу своего сообщения. Приветствия. – Tizer1000

+1

@ Tizer1000, вам нужно другое 'sort' с' lambda row: sum (map (int, row [1:])) ', чтобы получить общее количество. – falsetru

+0

Не могли бы вы изменить код выше, чтобы показать это? Спасибо! – Tizer1000

0

Использование sorted и map бросить строки в Интс:

>>> 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 
0

Вы можете подойти к проблеме так, как хорошо. Сначала я конвертирую все классы в целочисленный тип, чтобы я мог сохранить свою лямбда-функцию чистой. Я мог бы сделать преобразование в лямбда-функции, но мне это не очень нравится.

Вы можете увидеть разбиение каждой проблемы на другой модуль, дает возможность повторного использования.

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) 

Вы также можете использовать метод суммирования списка в лямбда-функции. Например:

return sorted(test, key=lambda record: sum(record[1:])\ 
            ,reverse=True) 
Смежные вопросы