2013-07-13 5 views
2

Я хочу отсортировать список по их оценке. То, что я до сих порСортировка названий по их резултатам

file = open("scores.txt", 'r') 
for line in file: 
    name = line.strip() 
    print(name) 
file.close() 

Я не уверен, как сортировать их.

Вот содержимое файла:

Matthew, 13 
Luke, 6 
John, 3 
Bobba, 4 

То, что я хочу выход быть:

John 3 
Bobba 4 
Luke 6 
Matthew 13 

Может кто-нибудь помочь?

ответ

4

вы можете использовать метод .split(','), чтобы разделить линию на отдельные ее части, затем используйте int(), чтобы преобразовать оценку в число. Метод .sort() сортирует список на месте, а key сообщает, что нужно сортировать.

scores = [] 
with open("scores.txt") as f: 
    for line in f: 
     name, score = line.split(',') 
     score = int(score) 
     scores.append((name, score)) 

scores.sort(key=lambda s: s[1]) 

for name, score in scores: 
    print(name, score) 

Это даст вам список кортежей, содержащих (имя, оценка) пар в отсортированном виде. Если вы хотите распечатать их с запятой между ними (чтобы держать его в соответствии) изменить шрифт, чтобы print(name, score, sep=', ')

чтение входного файла также может быть выражено в виде одной (большой) линии

with open("scores.txt") as f: 
    scores = [(name, int(score)) for name, score in (line.split(',') for line in f)] 

краткое объяснение key=:

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

Так что lambda также может быть записана в виде

def ret_score(pair): 
    return pair[1] 

И вы могли бы написать .sort(key=ret_score), но так как мы действительно не нужна эта функция для чего-то еще, его не надо объявить. Синтаксис лямбда

lambda <arguments> : <return value> 

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

>>> square = lambda x: x**2 # takes x, returns x squared 
>>> square(3) 
9 
>>> square(6) 
36 
+0

Есть ли способ сделать это так, в распечатывает Вертикально? Как- John 3 Bobba 4 Luke 6 Matthew 13 – user2365677

+0

@ user2365677 да я просто добавил, что –

+0

Просто ради информации,».sort (key = lambda s: s [1]) « Я знаю, что .sort, что означает лямбда? Он действительно работает, его то, что я хотел и спасибо :) – user2365677

Смежные вопросы