[英]python: dictionary and numpy.array issue
我有一本字典,其中包含與字符串關聯的數組(相同長度)。 我的目標是用相同的鍵創建一個新的字典,但剪切數組,僅保留我需要的元素。 我編寫了一個函數來執行此操作,但是問題是它返回的字典具有與每個鍵關聯的相同數組(正確的剪切長度),而我控制的打印命令顯示了正確的關聯。 功能如下:
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
顯示具有與每個鍵關聯的相同數組的字典。
在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
也許這不是最優雅的解決方案,但我認為它應該有效。
我認為您遇到了可變性和python定義變量的方法的典型問題:
numpy.zeros()
將a
定義為可變類型。 a
一個特定值,但是實際上您有一個指向實際值的指針列表的指針。 dic_extr[dic.keys()[i]] = a
您可以將此指針復制到dic_extr
數組中,而不是指針列表中。 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[:]
來實際復制a。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.