2017-08-30 84 views
0

我有一個與字符串關聯的數組(相同長度)的字典。我的目標是用相同的鍵創建一個新的字典,但切割數組,只保留我需要的元素。我寫了一個函數來做到這一點,但問題是它返回的字典與每個鍵相關的數組(正確的切割長度)相同,而我控制的打印命令顯示正確的關聯。這裏的功能:python:dictionary和numpy.array問題

def extract_years(dic,initial_year,final_year): 

    dic_extr = {} 
    l = numpy.size(dic[dic.keys()[0]]) 

    if final_year != 2013 : 
     a = numpy.zeros((final_year - initial_year)*251) 
    elif final_year == 2013 : 
     a = numpy.zeros(l - (initial_year-1998)*251) 

    for i in range(0,len(dic)): 
     #print i 
     for k in range (0,numpy.size(a)): 
      a[k] = dic[dic.keys()[i]][(initial_year-1998)*251 + k]   
      #print k 

     dic_extr[dic.keys()[i]] = a 
     print dic.keys()[i] 
     print dic_extr[dic.keys()[i]] 


    print dic_extr.keys() 
    print dic_extr 
    return dic_extr 

正如我所說,print dic_extr[dic.keys()[i]]顯示正確的結果,而最終print dic_extr表示關於每一個鍵同一個數組的字典。

+0

請修復縮進。 – zipa

+0

您能給出一個函數調用的例子,它有一個意想不到的結果,並且結果是您期望的嗎? – GLR

+0

https://pastebin.com/GSncW5DE 我粘貼終端輸出在這裏,因爲字典有超過300個元素和陣列很長。正如你可以看到第一個打印是'print dic.keys()[i] print dic_extr [dic.keys()[i]]' 而最後一個是print dic_extr'這是完全不同的,我只是預計整個首先打印在一起的新詞典 – tidus

回答

2

在Python中,每個對象都是一個指針。因此,您應該爲外部for循環的每次迭代創建一個新實例a。你可以這樣做,例如,初始化a數組循環內,像這樣:

def extract_years(dic,initial_year,final_year): 

    dic_extr = {} 
    l = numpy.size(dic[dic.keys()[0]]) 

    for i in range(0,len(dic)): 

     if final_year != 2013 : 
      a = numpy.zeros((final_year - initial_year)*251) 
     elif final_year == 2013 : 
      a = numpy.zeros(l - (initial_year-1998)*251) 

     for k in range (0,numpy.size(a)): 
      a[k] = dic[dic.keys()[i]][(initial_year-1998)*251 + k]   
      #print k 

     dic_extr[dic.keys()[i]] = a 
     print dic.keys()[i] 
     print dic_extr[dic.keys()[i]] 


    print dic_extr.keys() 
    print dic_extr 
    return dic_extr 

也許這不是最完美的解決方案,但我認爲它應該工作。

+0

這實際上工作! – tidus

+0

請將答案標爲有效。 – GLR

0

我想你跑進易變性和蟒蛇的方式典型的問題來定義變量:

  1. 您定義a使用numpy.zeros()是可變類型。
  2. 然後你讓a有一定的值,但你實際上有一個指向指針列表的指針,指向真值。
  3. 通過使用dic_extr[dic.keys()[i]] = a您將此指針複製到dic_extr數組中,而不是指針列表。
  4. 然後您更改指針列表引用的對象。
  5. 通過使用dic_extr[dic.keys()[i]] = a您將指針指向指向dic_extr數組的指針列表,而不是指針列表本身。

最後兩個指針指向同一個指針列表。簡單示例:

a = [1, 2, 3, 4, 5] 
b = a 
b[0] = 10 
print(a) # returns [10, 2, 3, 4, 5] 

您可以使用dic_extr[dic.keys()[i]] = a[:]實際製作副本。

Here is also a nice explaination to mutability in python.

+0

這個簡單的更改沒有起作用 – tidus

+0

它仍然指的是同樣的事情,或者是什麼問題? –

+0

只是相同的輸出 – tidus