2016-05-19 6 views
0

Текстовый файл объяснил:В: Как поместить значения в ключи в текстовом файле в порядок от самого большого - самого маленького? (Питон 2.7.11)

Joe,Bloggs,[email protected],01269512355, 1 , 20, 0, 0, 0 
fname, lname, email, number, ..., number i want to order ^, ...,...,.. 

Текстовый файл:

Joe,Bloggs,[email protected],01269512355, 1,20, 0, 0, 0 
Sarah,Brown,[email protected],01866522555, 1,25, 0, 0, 0 
Andrew,Smith,[email protected],01899512785, 1,30, 0, 0, 0 
Ray,Charles,[email protected],01268712321, 1,3, 0, 0, 0 
Kevin,White,[email protected],01579122345, 1,0, 5, 0, 0 
Samantha,Collins,[email protected],04269916257, 1,0, 0, 0, 0 

цель: я хочу, чтобы иметь возможность поставить ключи, чтобы на основе результатов значения [5]. Таким образом, легче изменить значение [4], так как мне нужно, чтобы верхние 2 скоринга и младшие 2 скоринговые клавиши изменили значение [4]. Как это так, высокий 2 значение [4] - 1, наименьшее значение оценка [4] + 1.

Текстовый файл после того, как код был бежать:

Andrew,Smith,[email protected],01899512785, 0,30, 0, 0, 0 
Sarah,Brown,[email protected],01866522555, 0,25, 0, 0, 0 
Joe,Bloggs,[email protected],01269512355, 1,20, 0, 0, 0 
Kevin,White,[email protected],01579122345, 1,5, 0, 0, 0 
Ray,Charles,[email protected],01268712321, 2,3, 0, 0, 0 
Samantha,Collins,[email protected],04269916257, 2,0, 0, 0, 0 

код, который я до сих пор:

f = open("players.txt", "r" 
lines = [] 
for line in f.readlines(): 
     line = [x.strip() for x in line.split(',')] 
     line[4] = int(line[4]) 
     line[5] = int(line[5]) 
     lines.append(line) 
f.close() 

values = sorted(list(set([l[4] for l in lines])),reverse=True) 
max_values = (values[0], values[1]) 

for line in lines: 
     if line[5] in max_values: 
       line[4] += 1 
     else: 
       line[4] -= 1 

with open("players.txt", "w") as f: 
      for line in lines: 
       line = [str(x) for x in line] 
       f.write(', '.join(line) + '\n') 

Это мой код, и это довольно сложно. Кажется, он не работает так, как я хочу, потому что он вызывает эту ошибку.

max_values = (values[0], values[1]) 
IndexError: list index out of range 

Не стесняйтесь полностью переписать мой код, чтобы сделать его лучше. Я новичок в кодировании и поэтому еще не знаю, что делать.

ответ

1

Ваша корневая проблема заключается в том, что все ваши значения l [4]: ​​. В вашем отсортированном заявлении, я думаю, вы хотите l [5], нет?

В данном коде все значения равны 1. Когда вы делаете набор из них, у вас остается только один элемент. Вы создаете список из набора, сортируете его, и полученный в результате список имеет только один элемент. Таким образом, значения [1] находятся за пределами допустимого диапазона.

Просто измените эту строку, чтобы правильно получить свой ключ сортировки. Обратите внимание на индекс , а не .

values = sorted(list(set([l[5] for l in lines])),reverse=True) 

Кроме того, я думаю, что вы неправильно обработки изменений для минимальных значений. Ваш код добавляет 1 для любого ключа, который не является одним из лучших 2, но вы сказали, что хотите изменить только нижние два. Попробуйте следующее:

max_values = (values[0], values[1]) 
min_values = (values[-1], values[-2]) 

for line in lines: 
     if line[5] in min_values: 
       line[4] += 1 
     elif line[5] in max_values: 
       line[4] -= 1 
+0

Я думаю, вы пропустите понимаете. Я хочу, чтобы клавиши были упорядочены в порядке возрастания от самого большого к наименьшему из значений [5]. Затем я хочу, чтобы верхние 2 в этом списке и нижняя 2 имели значение [4]. @Prune – Toby

+0

Я понимаю. Однако ваши клавиши имеют значения ** [5] **. Ваш ** отсортированный ** оператор собирает ключи из ** значений [4] **. – Prune

+0

благодарим вас за исправление. Теперь он работает красиво :) – Toby

2

Вы можете отсортировать строки, основанные на определенных парах с operator.itemgetter

from operator import itemgetter 
values = sorted(lines, key=itemgetter(4), reverse=True) 

Вы можете прочитать все строки в списке, который вы уже делаете.

Затем перебирать все строки в списке, чтобы обновить значение [4] или значение [5]

Затем вы можете использовать выше код для сортировки обновленного списка.

Идите по списку и напишите его в файл.

+0

Как я могу интегрировать это в свой код[email protected] – Toby

+0

Я обновил ответ! – wtpoo

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