Как выполнить итерацию по двум словарям сразу и получить результат, используя значения и ключи от обоих
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"
Выше мой код в настоящее время. По какой-то причине, однако, он, кажется, выполняет первый цикл, затем второй, затем второй, затем первый, затем второй. Кажется, что он делает второй цикл каждый раз, когда он добирается до него, прежде чем вернуться в первый цикл for
. Из-за этого ответы, которые я получаю, неверны.
Ответы
Ответ 1
Вопрос немного расплывчатый, но, отвечая на заголовок, вы можете получить и ключи, и значения одновременно, например так:
>>> 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
Однако учтите, что ключи в словарях не упорядочены. Кроме того, если два словаря не содержат одинаковое количество ключей, приведенный выше код завершится ошибкой.
Ответ 2
Вопрос не совсем определен, и принятый ответ не удастся для некоторых словарей. Он полагается на заказ ключей, который не гарантируется. Добавление дополнительных ключей в словарь, удаление ключей или даже добавление заказа могут повлиять на порядок.
Более безопасным решением является выбор одного словаря, d
в этом случае, чтобы получить ключи, а затем использовать их для доступа к второму словарю:
d = {'a':5, 'b':6, 'c': 3}
d2 = {'a':6, 'b':7, 'c': 3}
[(k, d2[k], v) for k, v in d.items()]
Результат:
[('b', 7, 6), ('a', 6, 5), ('c', 3, 3)]
Это не сложнее, чем другие ответы, и явствует, какие ключи доступны. Если словари имеют разные порядки клавиш, скажем d2 = {'x': 3, 'b':7, 'c': 3, 'a':9}
, все равно будут получены согласованные результаты.
Ответ 3
Глядя на вашу проблему, я предлагаю вам создать генераторное выражение, которое перемещает два словаря парами и используя max с пользовательским ключ для расчета цены продажи для оценки expected_sale_price
и соответствующего запаса
Примеры данных
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))))
Пример кода
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)