【问题标题】:How to add an empty item in a dictionary in python?如何在python的字典中添加一个空项?
【发布时间】:2020-09-25 13:45:32
【问题描述】:

我在 python 中创建了一个这样的字典:

 dictionary = dict(zip(numpy.arange(5), numpy.arange(5)*10))

我使用字典如下:

 y = np.vectorize(lambda x: dictionary[x])

现在我想添加一个特殊情况:如果输入x 是一个空数组,那么输出也是一个空数组。我试图在字典中添加一个空数组:

 dictionary[np.array([], dtype='int64')] = np.array([], dtype='int64')

但我得到了一个错误:

*** TypeError: unhashable type: 'numpy.ndarray'

为什么它不起作用?这里应该如何处理空数组?

【问题讨论】:

  • 你不能。 dict 键不能是可变对象。空列表/数组是可变对象。在执行dict[x] 时,x 成为一个数组(无论是否为空)是没有意义的。 x 最多可以是一个空元组。
  • @f. C。请检查这个答案https://stackoverflow.com/a/7027308/12420884
  • 如果我尝试调用y([]),除非设置了otypes,否则我会在大小为0 的输入上得到ValueError: cannot call vectorize`。它永远不会影响您的功能。如果你传入一个数字数组,你的函数也永远不会得到一个空数组。
  • 此外,这看起来像是一个巨大的 XY 问题。我怀疑你需要解释你真正想要做什么。 np.vectorize 几乎永远不是正确答案。
  • 如果您的字典表示可以表示为函数的映射(如此处),则最好将函数转换为 numpy 管道而不是使用np.vectorize

标签: python numpy


【解决方案1】:

看看你的字典:

In [21]: dd = dict(zip(numpy.arange(5), numpy.arange(5)*10))
In [22]: dd
Out[22]: {0: 0, 1: 10, 2: 20, 3: 30, 4: 40}

键是数字。没有numpy也可以生产同样的东西:

In [23]: dict(zip(range(5), range(0,50,10)))
Out[23]: {0: 0, 1: 10, 2: 20, 3: 30, 4: 40}

您的vectorize 数组访问权限:

In [29]: y = np.vectorize(lambda x: dd[x], otypes=[int])
In [30]: y([0,1,3])
Out[30]: array([ 0, 10, 30])
In [31]: y([])
Out[31]: array([], dtype=int64)

我添加了otypes,以便[] 起作用。

我不明白您为什么要添加具有数组键的条目。其他键都不是数组。而且你发现数组不能是键。

dictionary[np.array([], dtype='int64')]

vectorize 将标量值从参数传递给您的函数。它不传递数组。因此,将数组(无论是否为空)作为键是没有意义的。

np.vectorize 是否是使用这本词典的最佳工具是另一个问题。通常它不会提高迭代访问的速度。使用字典可能是潜在的问题,因为它一次只能通过键访问。

===

没有otypesvectorize 会引发错误

ValueError: cannot call `vectorize` on size 0 inputs unless `otypes` is set

vectorize 尝试调用函数以确定返回数据类型。

===

这是您的y 的一个更强大的版本,它不会因丢失的键而窒息:

In [32]: y = np.vectorize(lambda x: dd.get(x,-100), otypes=[int])
In [33]: y([1,2,3,10])
Out[33]: array([  10,   20,   30, -100])

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-07-10
    • 1970-01-01
    • 1970-01-01
    • 2015-07-02
    • 2019-02-08
    • 2022-01-23
    • 1970-01-01
    相关资源
    最近更新 更多