2017-07-23 1 views
0

Dans Comprehension le code suivant:Comment itérables retour dans la liste Python

states = ["A","B","C","D"] 
priors = {"A": 1.0, "B": -1.0, "C": 0, "D": 0} 

values = {} #setup an empty dictionary 
for s in states: 
    values[s] = {"Value1": priors[s], "Value2": 3.0} 

max_val = max(values[prevS]["Value1"]*-1 for prevS in states) 

Je dois retourner MAX_VAL et les prevS qui correspond à cette valeur max. Comment puis-je faire ceci?

+1

Pourquoi votre code 'max_val' dans une boucle? il n'utilise pas la variable de boucle, donc il exécute juste un tas de fois faire la même chose chaque fois redondant. – BrenBarn

+0

Vous avez 4 max_val's: 1.0, 1.0, 0.0 et 0.0. Lequel voulez-vous conserver? – DyZ

+0

J'ai clarifié la question pour supprimer ce problème. Le cœur de cela est que j'essaie d'obtenir à la fois le max() et l'état prevS qui le génère. – SeeDerekEngineer

Répondre

2

Vous pouvez le faire:

>>> max((values[prevS]["Value1"]*-1, prevS) for prevS in states) 
(1.0, 'B') 

Cela fait un tuple de la valeur et de sa valeur prevS et prend le maximum de ceux-ci. Puisque la "valeur" vient en premier, le max fonctionnera sur ce premier, et la valeur prevS ne sera utilisée que pour rompre les liens.

1

Peut-être que c'est ce que vous voulez?

states = ["A","B","C","D"] 
priors = {"A": 1.0, "B": -1.0, "C": 0, "D": 0} 

values = ((item[0], item[1]*-1) for item in priors.items() if item[0] in states) 

print max(values, key=lambda i:i[1]) 

Résultat

('B', 1.0) 

Ou ceci:

states = ["A","B","C","D"] 
priors = {"A": 1.0, "B": -1.0, "C": 0, "D": 0} 

values = {item[0]:{'Value1':item[1]*-1, 'Value2':3.0} for item in priors.items() if item[0] in states} 

print max(values.items(), key=lambda i: i[1]['Value1']) 

Résultat

('B', {'Value2': 3.0, 'Value1': 1.0})