2016-12-09 5 views
1

У меня есть скрипт, который читает и проверяет файл, который имеет строки следующим образом, каждое поле отделяется «»:получить только последнюю пару словаря в Python3

Ezequiel Garay,23,230,0,1

Я сделал функцию чтобы получить первое поле, которое имеет максимальное значение, полученное из: (4th_field * 3rd_field)/2nd_field

Мой код выглядит следующим образом:

#!/usr/bin/python3 
def maxperf(lj): 
    n = lj[0] 
    if (int(lj[1])) > 0: 
      performance=((int(lj[3]) + 1)*(int(lj[2])))/int(lj[1]) 
    else: performance=0 

    par = dict([(n,performance)])  
    return max(par, key = par.get) 

archivojugs = open("datos_ej1.txt") 
jugadores = [] 
for jugador in archivojugs: 
    jugadores = jugador.split(",") 
    mp=maxperf(jugadores) 


print(mp) 
archivojugs.close() 

Проблема в том, что я получаю только последнюю пару словаря (я имею в виду, что каждая строка перезаписывает предыдущую, а не добавляет ее), что случилось с моим кодом?

UPDATE: Я изменил ответы:

#!/usr/bin/python3 
def calcperf(n,pj,d,gg): 
    '''Calculo performance''' 
    if int(pj) > 0: 
     p = ((int(gg) + 1) * int(d))/int(pj) 
    else: p = 0 

    return p 

def maxperf(lp): 
    '''Saco el jugador con mejor rendimiento''' 
    mp = max(lp, key=lp.get) 
    return mp 



archivojugs = open("datos_ej1.txt") 
listperfs = {} 

for jugador in archivojugs.readlines(): 
    NOMBRE, PJ, DISTANCIA, GOLES, CONTROL = jugador.split(',') 
    rendimiento = calcperf(NOMBRE,PJ,DISTANCIA,GOLES) 
    listperfs[NOMBRE] = rendimiento 

mejorperf = maxperf(listperfs) 

print(mejorperf) 

archivojugs.close 

И это работает отлично

ответ

2

Это потому, что вы печатаете mp, которая изменяется в каждой итерации для цикла и вы только получить его состояние от последней итерации. Кроме того, ваш словарь par является локальным для функции maxperf и содержит только одну запись при каждом вызове этой функции.

Вам понадобится нелокальный словарь, который сохранит результаты вашей функции maxperf. Давайте создадим один, который не хранит вычисленный производительность на всех, просто возвращает его:

def perf(lj): 
    n = lj[0] 
    if (int(lj[1])) > 0: 
     performance=((int(lj[3]) + 1)*(int(lj[2])))/int(lj[1]) 
    else: 
     performance=0 
    return n, performance 

Теперь вернемся к нашей петле:

par = {} 
for jugador in archivojugs: 
    jugadores = jugador.split(",") 
    name, p = perf(jugadores) 
    par[name] = p 

maxperf = max(par, key=par.get) 
print(maxperf) 

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

import operator 
mp = max(perf(jugador.split(',')) for jugador in archivojugs, 
     key=operator.itemgetter(1)) 
print(mp) 
+0

Я не понимаю, как делает строку 'имя, перфорация = Perf (') Игроки Команды работы – sebelk

+0

О, я вижу, что он получает то, что возвращает функция perf – sebelk

+1

@sebelk: он распаковывает кортеж, возвращаемый 'perf()', на две переменные: 'name' и' perf'. –

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