Python 如何一次迭代两个字典,并使用两个字典中的值和键获得结果 def GetSale():#计算预期销售价值并返回具有最高预期销售价值的股票的信息 全球价格 全球风险敞口 全球cprice 全球价格 全球风险 全球份额 全球当前最高销售额 最佳库存=“” 对于价格中的价值。值(): cprice=值[1] b价格=值[0] 对于键,Exposure.items()中的值: 风险=价值[0] 股份=价值[1] 预期销售额=((cprice-bprice)-风险*cprice)*股份 打印(预期销售额) 如果当前最高销售额

Python 如何一次迭代两个字典,并使用两个字典中的值和键获得结果 def GetSale():#计算预期销售价值并返回具有最高预期销售价值的股票的信息 全球价格 全球风险敞口 全球cprice 全球价格 全球风险 全球份额 全球当前最高销售额 最佳库存=“” 对于价格中的价值。值(): cprice=值[1] b价格=值[0] 对于键,Exposure.items()中的值: 风险=价值[0] 股份=价值[1] 预期销售额=((cprice-bprice)-风险*cprice)*股份 打印(预期销售额) 如果当前最高销售额,python,loops,Python,Loops,以上是我目前的代码。但出于某种原因,它似乎在执行第一个循环,然后是第二个循环,然后是第二个循环,然后是第一个循环,然后是第二个循环。在返回第一个循环之前,它似乎每次到达第二个循环时都会执行第二个循环。正因为如此,我得到的答案是不正确的。问题有点模糊,但回答标题时,您可以同时获得键和值,如下所示: def GetSale():#calculates expected sale value and returns info on the stock with highest

以上是我目前的代码。但出于某种原因,它似乎在执行第一个循环,然后是第二个循环,然后是第二个循环,然后是第一个循环,然后是第二个循环。在返回第一个
循环之前,它似乎每次到达第二个循环时都会执行第二个循环。正因为如此,我得到的答案是不正确的。

问题有点模糊,但回答标题时,您可以同时获得键和值,如下所示:

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"

但是,请注意字典中的键不是按顺序排列的。此外,如果两个字典包含的键数不相同,则上述代码将失败。

查看您的问题,我建议您创建生成器表达式,成对导航两个字典,并使用自定义键计算销售价格,以评估
预期销售价格和相应的股票

样本数据

示例代码


这个问题没有很好的定义,对于一些词典来说,被接受的答案将失败。它依赖于密钥排序,但这并不能保证。向字典中添加其他键、删除键,甚至添加键的顺序都会影响顺序

更安全的解决方案是选择一个字典,
d
,在本例中,从中获取密钥,然后使用这些密钥访问第二个字典:

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)
结果:

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

这并不比其他答案更复杂,并且明确了访问哪些键。如果字典有不同的键顺序,比如说
d2={'x':3,'b':7,'c':3,'a':9}
,仍然会给出一致的结果。

它应该怎么做?按照代码的结构方式,第二个循环位于第一个循环内,因此它将在第一个循环的每次迭代中执行第二个循环一次。一次循环两个字典通常没有意义,除非它们具有相同的键。我需要它为第一个循环的每次迭代执行第二次循环,因为两个字典的长度相同。我需要它们的信息来计算预期的值。但是由于某种原因,如果我在两个字典中都有不止一个键/值对,那么数学会做一些奇怪的事情,而且看起来并不总是正确的——它们有相同的键。只有值不同,缩进被破坏。不清楚实际代码中的缩进是什么样的;请修复您的帖子。不要盲目批准编辑。这是公然的剽窃。这是复制粘贴的。真的吗?我认为这很有描述性,至少目前是这样。@aIKid,即使两本字典的键数不一样,我们也能这样做吗?我现在遇到了这个问题…@CF84 iterable
zip()
返回的长度应该等于最短输入的长度,因此如果您有不同大小的iterable作为输入,例如
zip([1,2,3],[11,22,33,44,55])
,那么它仍然可以工作,但结果将是
[(1,11)、(2,22)、(3,33)]
。因此,较长iterable(s)的尾随值被忽略。此外,请注意字典没有排序,(但
OrderedDict
s是),因此当您迭代字典时,键和值的顺序可能不是您所期望的。(通常情况下,它的顺序与您添加它们时的顺序不同。)因此,当您同时使用相同的键遍历两个字典时,这些键甚至可能不会以相同的顺序出现。超级解决方案。您能解释一下这是一种简单的方法吗?只有当d2与d具有相同的键时,此想法才有效,如果d2有一个键“foo”,那么它将被省略,因为它在dict d中不存在
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)
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)]