【问题标题】:python: dictionary and numpy.array issuepython:字典和numpy.array问题
【发布时间】:2018-02-08 00:08:55
【问题描述】:

我有一个字典,其中包含与字符串关联的数组(相同长度)。我的目标是创建一个具有相同键但切割数组的新字典,只保留我需要的元素。我写了一个函数来做到这一点,但问题是它返回一个字典,其中每个键都具有相同的数组(正确的剪切长度),而我用来控制的打印命令显示了正确的关联。函数如下:

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 显示了一个字典,其中每个键都关联了相同的数组。

【问题讨论】:

  • 请修正缩进。
  • 你能否举一个函数调用的例子,它有一个意想不到的结果,并且结果是你所期望的?
  • pastebin.com/GSncW5DE 我在这里粘贴了终端输出,因为字典有 300 多个元素并且数组很长。如您所见,第一个打印件是print dic.keys()[i] print dic_extr[dic.keys()[i]],而最后一个打印件是print dic_extr,这是完全不同的,我只是希望整个第一个打印件都在新字典中

标签: python arrays python-2.7 numpy dictionary


【解决方案1】:

我认为您遇到了可变性和python定义变量方式的典型问题:

  1. 您使用numpy.zeros() 将a 定义为可变类型。
  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[:] 来实际制作 a 的副本。

Here is also a nice explaination to mutability in python.

【讨论】:

  • 还是指同一个东西还是有什么问题?
  • 输出相同
【解决方案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

也许这不是最优雅的解决方案,但我认为它应该可以工作。

【讨论】:

    猜你喜欢
    • 2021-08-02
    • 1970-01-01
    • 1970-01-01
    • 2011-04-28
    • 1970-01-01
    • 2021-05-03
    • 2011-03-17
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多