Как выполнить итерацию по двум словарям сразу и получить результат, используя значения и ключи от обоих

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)