Cómo iterar sobre dos diccionarios a la vez y obtener un resultado utilizando valores y claves de ambos

def GetSale():#calculates expected sale value and returns info on the stock with highest expected sale value global Prices global Exposure global cprice global bprice global risk global shares global current_highest_sale best_stock=' ' for value in Prices.values(): cprice=value[1] bprice=value[0] for keys, values in Exposure.items(): risk=values[0] shares=values[1] Expected_sale_value=( (cprice - bprice ) - risk * cprice) * shares print (Expected_sale_value) if current_highest_sale < Expected_sale_value: current_highest_sale=Expected_sale_value best_stock=Exposure[keys] return best_stock +" has the highest expected sale value" 

Arriba está mi código actualmente. Por alguna razón, sin embargo, parece estar haciendo el primer bucle, luego el segundo, luego el segundo, luego el primero, luego el segundo. Parece que hace el segundo bucle cada vez que llega antes de volver al primer bucle for . Es por esto que las respuestas que estoy recibiendo no son correctas.

La pregunta es un poco vaga, pero respondiendo al título, puede obtener tanto las claves como los valores al mismo tiempo de esta manera:

 >>> d = {'a':5, 'b':6, 'c': 3} >>> d2 = {'a':6, 'b':7, 'c': 3} >>> for (k,v), (k2,v2) in zip(d.items(), d2.items()): print k, v print k2, v2 a 5 a 6 c 3 c 3 b 6 b 7 

La pregunta no está bien definida y la respuesta aceptada fallará para algunos diccionarios. Se basa en el pedido de llaves, que no está garantizado. Agregar claves adicionales a un diccionario, eliminarlas o incluso el orden en que se agregan puede afectar el orden.

Una solución más segura es elegir un diccionario, d en este caso, para obtener las claves y luego usarlas para acceder al segundo diccionario:

 d = {'a':5, 'b':6, 'c': 3} d2 = {'a':6, 'b':7, 'c': 3} [(k, d2[k], v) for k, v in d.items()] 

Resultado:

 [('b', 7, 6), ('a', 6, 5), ('c', 3, 3)] 

Esto no es más complejo que las otras respuestas, y es explícito acerca de las teclas a las que se accede. Si los diccionarios tienen diferentes ordenamientos de claves, diga d2 = {'x': 3, 'b':7, 'c': 3, 'a':9} , aún se dan resultados consistentes.

En cuanto a su problema, le sugiero que cree una expresión generadora que navegue por los dos diccionarios en pares y que utilice max con una clave personalizada para calcular el precio de venta para evaluar el precio expected_sale_price y el stock correspondiente.

Data de muestra

 Prices = dict(zip(range(10), ((randint(1,100), randint(1,100)) for _ in range(10)))) Exposure = dict(zip(range(10), ((randint(1,100), randint(1,100)) for _ in range(10)))) 

Código de muestra

 def GetSale(Prices, Exposure): '''Get Sale does not need any globals if you pass the necessary variables as parameteres ''' from itertools import izip def sale_price(args): ''' Custom Key, used with the max function ''' key, (bprice, cprice), (risk, shares) = args return ( (cprice - bprice ) - risk * cprice) * shares #Generator Function to traverse the dict in pairs #Each item is of the format (key, (bprice, cprice), (risk, shares)) Price_Exposure = izip(Prices.keys(), Prices.values(), Exposure.values()) #Expected sale price using `max` with custom key expected_sale_price = max(Price_Exposure, key = sale_price) key, (bprice, cprice), (risk, shares) = expected_sale_price #The best stock is the key in the expected_sale_Price return "Stock {} with values bprice={}, cprice = {}, risk={} and shares={} has the highest expected sale value".format(key, bprice, cprice, risk, shares)