【问题标题】:How to create a dictionary of arrays to strings in Python?如何在 Python 中创建数组到字符串的字典?
【发布时间】:2017-11-14 23:45:53
【问题描述】:

我正在尝试创建一个字典,将特定数组(如 [1,1,0,0])映射到字符串“Car”,但字典不接受数组或列表

a={(1,1,0,0):'Car',
(0,0,0,1):'Pedestrian',    
(1,0,0,0):'Traffic Light'}

b=np.array([[1,1,0,0],[1,0,0,0],[0,0,0,1]])

两个代码都没有错误,但显然它们不匹配。这是我的想法:

b.map(a)

Out[3]=['Car','Traffic Light','Pedestrian']

提前致谢。

【问题讨论】:

  • 字典键必须是不可变类型;这就是元组有效,而列表无效的原因。
  • 是的,dict 对象不能将 listnp.array 对象作为键。或许tuple(my_list) 作为键?
  • 一旦您按照定义使用map,您的 dict + array 解决方案似乎将起作用。你被困在哪里了?
  • 另外,np.ndarray 对象没有 .map 方法...

标签: python arrays python-3.x dictionary


【解决方案1】:

一个简单的列表推导就可以了,将每个内部数组转换为一个元组,然后将其传递给字典进行查找:

>>> out = [a[tuple(x)] for x in b]
>>> out
['Car', 'Traffic Light', 'Pedestrian']

【讨论】:

    【解决方案2】:

    您可以使用元组作为键来获取字符串。您不能使用列表作为键的原因是因为列表可以修改,并且您不会在代码中的其他位置修改字典键。

    >>> a[[1,1,0,0]] # Won't work because it's not a tuple
    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
    TypeError: unhashable type: 'list'
    
    >>> a[(1,1,0,0)] # Works
    'Car'
    

    如果你想使用列表作为键,那么你可以转换它

    >>> a[tuple([1,1,0,0])]
    'Car'
    

    如果您有一个数组列表(如您的示例中),那么您可以像这样获取所有匹配的字符串

    >>> b=np.array([[1,1,0,0],[1,0,0,0],[0,0,0,1]])
    >>> [a[tuple(eachList)] for eachList in b]
    ['Car','Traffic Light','Pedestrian']
    

    【讨论】:

      【解决方案3】:

      如果b 是一个大数组,如果您要提高效率,请将其转换为可散列键:

      B=(b<<np.arange(4)).sum(1)
      # array([3, 1, 8], dtype=int32)
      

      然后将dict定义为:

      A={1: 'Traffic Light', 3: 'Car', 8: 'Pedestrian'}
      

      现在的映射可以是:

      [A[key] for key in B]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-12-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-03-10
        • 2017-09-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多