python - 从列表中删除作为字典值的值时,ValueError 真值不明确
问题描述
我测试了这段代码:
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 匹配,则可以删除。但如果他们不这样做,它会求助于逐个元素地比较列表。但是,当其中一个元素是数组时,就会遇到歧义问题。
推荐阅读
- javascript - React Store 没有第一次返回 getMethod 的值
- javascript - JQuery Show/Hide multiple elements based on combined multiple data attributes and search field
- dax - Index column not resetting after I apply filter in Dax?
- aspnetboilerplate - How to restrict access to swagger from Angular side when using aspnetboilerplate
- visual-studio - VSTest.Console.exe test status is not returned mid test run
- android - Android Studio : MediaMetadataRetriever() does not work
- opengl - How to use OpenSceneGraph OpenGL context in GStreamer?
- java - \n 在嵌入字符串的末尾导致正则表达式无法匹配
- java - How can we call abstract class constructor?
- lua - How can I use Chinese letters for locals lua