2013-12-23 95 views
6
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

它應該做什麼?你有代碼結構的方式,第二個循環在第一個循環內部,所以它會爲第一個循環的每次循環執行一次第二個循環。 – user2357112

+0

請注意,字典是無序的。一次循環使用兩本字典通常沒有意義,除非它們具有相同的密鑰。 – user2357112

+0

我需要它爲第一個循環的每次迭代執行第二次循環,因爲這兩個字典的長度都是相同的。我需要從它們兩個的信息來計算Expected_sale_value。但是由於某種原因,如果我在兩個字典中都有多個鍵/值對,那麼數學會做出奇怪的事情,並且不會總是顯示出來。 – arisonu123

回答

20

的問題是有點模糊,但回答的題目,你可以在同一時間這樣的鍵和值:

>>> 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 
+0

請勿盲目批准修改。 [這個編輯](http://stackoverflow.com/review/suggested-edits/3679345)是公然剽竊。它是從http://math.hws.edu/javanotes/TextIO_Javadoc/TextIO.html複製的。 –

+3

真的嗎?我認爲這是相當具有描述性的,至少暫時是如此。 – aIKid

+0

@aIKid即使兩個字典的鍵數不一樣,我們可以做到嗎?我現在有這個問題... – FaCoffee

-1

看到你的問題,我建議你創建生成器表達式該導航成對兩個字典,並使用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) 
3

的問題沒有得到很好的定義,答案會接受一些字典失敗。它依賴於按鍵排序,這是不能保證的。將其他鍵添加到詞典中,刪除鍵,甚至添加它們的順序都會影響排序。

一個更安全的方案是選擇一個字典,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},則仍會給出一致的結果。