繁体   English   中英

从列表中删除作为字典值的值时,ValueError真值模棱两可

[英]ValueError truth value ambiguous when removing value from list which are values of a dictionary

我测试了这段代码:

dic = {1:[[[1],2],[[2],3],[[3],4]],2:[[[5],6],[[7],8]],3:[[[9],10],[[11],12]]}
klst = list(dic.keys())
# print(klst)
print(dic[1])
for item in dic[klst[0]]:
    if item == [[2],3]:
        dic[klst[0]].remove(item)
        print(item)
        break

print(dic)

我得到以下输出:

[[[1], 2], [[2], 3], [[3], 4]]
[[2], 3]
{1: [[[1], 2], [[3], 4]], 2: [[[5], 6], [[7], 8]], 3: [[[9], 10], [[11], 12]]}

因此,remove()可以从字典的值列表中完美删除列表。

我已经实现了类似的结构,其中是启发式值, 是列表列表。 内部列表由一个numpy数组和一个字符串组成。 例如:

[array([[10,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  0,  9, 11]]), 'left']

现在我试图从字典中删除这样的列表,并得到

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

该代码工作了前两次,从字典中删除了该列表

for move in index_move_priority:
            for item in open_nodes[keylist[0]]: # item in list of states
                if move == item[1]:
                    print("KLYST",keylist[0])
                    print("////////////////",open_nodes[keylist[0]])
                    print("ITEM->",item)
                    print(type(open_nodes[keylist[0]]))
                    print(type(item))
                    open_nodes[keylist[0]].remove(item)
                    find_neighbor_node = item
                    temp = True
                    break
            if temp == True:
                break

这里的open_nodes是我的字典。 线

open_nodes[keylist[0]].remove(item)

导致ValueError。 在错误之前,我已经按如下方式打印了keylist [0]open_nodes [keylist [0]]的内容。

KLYST 8
//////////////// [[array([[10,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  0,  9, 11]]), 'left'], [array([[10,  1,  2,  3],
       [ 4,  0,  6,  7],
       [ 8,  9,  5, 11]]), 'up-left'], [array([[10,  1,  0,  3],
       [ 4,  5,  2,  7],
       [ 8,  9,  6, 11]]), 'up'], [array([[10,  1,  2,  3],
       [ 4,  0,  5,  7],
       [ 8,  9,  6, 11]]), 'left'], [array([[10,  0,  2,  3],
       [ 4,  5,  1,  7],
       [ 8,  9,  6, 11]]), 'up-left']]
ITEM-> [array([[10,  1,  0,  3],
       [ 4,  5,  2,  7],
       [ 8,  9,  6, 11]]), 'up']

我不明白为什么我会得到模棱两可的价值错误。 更新:在这里找到代码https://github.com/idk-kid/test/blob/master/test.ipynb

remove使用相等性测试。 这种对数组的测试与列表不同。

列表删除:

In [86]: alist = [[1,2],[3,4]]
In [87]: alist.remove([1,2])
In [88]: alist
Out[88]: [[3, 4]]

数组删除-您的错误

In [89]: alist = [np.array([1,2]),np.array([3,4])]
In [90]: alist.remove(np.array([1,2]))
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-90-367c77859b46> in <module>()
----> 1 alist.remove(np.array([1,2]))

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

如果我按位置引用数组,则remove可以工作。 比较首先测试ID:

In [91]: alist.remove(alist[0])
In [92]: alist
Out[92]: [array([3, 4])]

但是,如果ID不匹配,则它将继续测试值。 但是对数组的布尔测试会产生布尔数组:

In [93]: alist[0]==np.array([3,4])
Out[93]: array([ True,  True])

在期望标量的上下文中使用多元素数组(例如if子句)会产生这种歧义性错误。

列表比较可以通过值进行,返回一个标量:

In [94]: Out[88][0]==[3,4]
Out[94]: True

列表和数组在许多方面都相似,但通常不是彼此的直接替换。

编辑

当数组嵌套在列表中时,同样的情况也适用。 使用最近的打印:

In [104]: alist.remove(item)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-104-f439b16b219c> in <module>()
----> 1 alist.remove(item)

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
In [105]: alist[0]
Out[105]: 
[array([[10,  1,  2,  3],
        [ 4,  5,  6,  7],
        [ 8,  0,  9, 11]]), 'left']
In [106]: item
Out[106]: 
[array([[10,  1,  0,  3],
        [ 4,  5,  2,  7],
        [ 8,  9,  6, 11]]), 'up']
In [107]: alist[0]==item
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-107-d1fe30e1a331> in <module>()
----> 1 alist[0]==item

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
In [108]: alist.remove(alist[0])
In [109]: alist
Out[109]: 
[[array([[10,  1,  2,  3],
         [ 4,  0,  6,  7],
         [ 8,  9,  5, 11]]), 'up-left'], [array([[10,  1,  0,  3],
         [ 4,  5,  2,  7],
         [ 8,  9,  6, 11]]), 'up'], [array([[10,  1,  2,  3],
         [ 4,  0,  5,  7],
         [ 8,  9,  6, 11]]), 'left'], [array([[10,  0,  2,  3],
         [ 4,  5,  1,  7],
         [ 8,  9,  6, 11]]), 'up-left']]

如果列表ID匹配,则可以删除。 但是,如果他们不这样做,就只能逐个比较列表。 但是,当这些元素之一是数组时,就会遇到歧义性问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM