Only get the last pair of dictionary in python3

时间:2016-12-09 12:52:19

标签: python-3.x dictionary

I have a script that read and parse a file that has lines as follows, every field is separated by ",":

Ezequiel Garay,23,230,0,1

I made a function to obtain the first field that has the maximum value resulting of: (4th_field * 3rd_field ) / 2nd_field

My code is as follows:

#!/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()

The problem is that I get only the last pair of the dictionary (I mean, it's as if each line overwrite the earlier one instead of append it), what's wrong with my code?

UPDATE: I've modified the answers:

#!/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

And it works fine

1 个答案:

答案 0 :(得分:2)

那是因为你正在打印mp,它在for循环的每次迭代中都会发生变化,而你只能从最后一次迭代中获得它的状态。此外,您的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)