2017-08-30 88 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