2015-01-14 2 views
0

Я работал над этим кодом (на python), чтобы распечатать CSV-файл, отсортированный. Первый выбор отлично работает и сортирует его по алфавиту. Однако раздел Choice 2 должен сортировать файл csv с наивысшим результатом. текст/файл CSV (Что здесь не так с выбором 2?

name, score, out of: 

Ben,5,20 
James,6,20 
Adam,12,20 
Will,20,20 

код:

import operator 
import csv 

file = open("scores.txt", "r") 

scores = csv.reader(file, delimiter=",") 

sort = sorted(scores) 
for i in range(0, len(sort)): 
    sort[i].append((max(sort[i][1:2]))) 

#Alphabetical Order 
choice = input("Choice: ") 

if choice == "1": 
    sort = list(sorted(sort,key = operator.itemgetter(0), reverse=False)) 

    print("\nAlphabetical Order:") 
    print("===================") 
    for i in range(0, len(sort)): 
     print("Name: ", sort[i][0], "\tScore: ", sort[i][1]) 

#Highest score 
#sort = sorted(scores) 
elif choice == "2": 


    print("\nHigh Scores:") 
    print("============") 
    sort = list(sorted(sort,key = operator.itemgetter(1, 2),reverse=True)) 
    for i in range(0, len(sort)): 
     print("Name:", sort[i][0], "\tScore:", sort[i][1], "Out of", sort[i][2]) 

ответ

-1

Ваш "выбор" приходит в виде целого числа, а вы сравниваете его со строкой, поэтому правильное сравнение будет:

if str(choice) == "1": 
    #do something 
elif str(choice) == "2": 
    #do something 
+1

не сравнивать строки с 'is'. это для личности. http://stackoverflow.com/questions/1504717/why-does-comparing-strings-in-python-using-either-or-is-sometimes-produce –

+0

yes, Вы правы – BigBang

+0

Это, вероятно, не главная проблема в код op. Если он использует 'python 3.x',' input() 'возвращает строку. Однако стоит отметить, что он работает над более ранними версиями python. – VHarisop

0

Прежде всего:

max(sort[i][1:2]) 

вернет только первую пару чисел, потому что срез возвращает элементы 1 через 2-1. Вы можете изменить его на

max(sort[i][1:3]) 

Однако поля, которые соответствуют номерам в файле .csv являются строки (как они вернулись из csv.reader). Вы должны подумать о том, чтобы превратить их в ints при сортировке. Самый простой способ без использования operator штуковины использует анонимную функцию, которая отображает строку пару в кортеж Интса:

sort = sorted(sort, key = lambda x: (int(x[1]), int(x[2])), reverse = True) 
# no need to put the rvalue in list() 

, который использует в качестве ключевого кортежа целых чисел, которые соответствуют вашему номеру паре. Кроме того, если вы используете python 2.x, вы должны либо переключиться на raw_input, либо использовать input и использовать str(choice), как указывает ответ BigBang.

Чтобы узнать, почему ваш ключевой выбор не работает при сортировке в соответствии с числовой парой, имейте в виду, что пара чисел возвращается из csv.reader в список строк (например, ['Name', '12', '20']). Легко видеть, что:

>>> ('12', '20') > ('6', '20') 
False 

Это сравнение не соответствует случае 12 > 6 потому, что строки сравниваются лексикографически. Здесь «1» меньше «6».

0

Если первая часть работает, то, очевидно, вы используете python3, вам просто нужно сортировать оценки для сортировки в алфавитном порядке, поскольку имена приходят первыми. Чтобы сортировать по результату, вам нужно отдать команду int.

with open("scores.txt") as f: 
    headers = next(f)# skip header 
    scores = list(csv.reader(f, delimiter=",")) 
    inp = input("Choose 1 for alpha sort or 2 for highscore sort") 

    if inp == "1": 
     print("\nAlphabetical Order:") 
     scores.sort() 
     for name,score,out in scores: 
      print("Name: {} score: {} out of {}".format(name,score,out)) 

    elif inp == "2": 
     print("\nHigh Scores:") 
     print("============") 
     scores.sort(key=lambda x:int(x[1]),reverse=True) 
     for name,score,out in scores: 
      print("Name: {} score: {} out of {}".format(name,score,out)) 

Выход:

Alphabetical Order: 
=================== 
Name: Adam score: 12 out of 20 
Name: Ben score: 5 out of 20 
Name: James score: 6 out of 20 
Name: Will score: 20 out of 20 
High Scores: 
============ 
Name: Will score: 20 out of 20 
Name: Adam score: 12 out of 20 
Name: James score: 6 out of 20 
Name: Ben score: 5 out of 20 
Смежные вопросы