Значение ValueError истина неоднозначно при удалении значения из списка, которые являются значениями словаря

1

Я проверил этот фрагмент кода:

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']

Я не понимаю, почему я получаю неоднозначную ошибку значения. UPDATE: найдите здесь код https://github.com/idk-kid/test/blob/master/test.ipynb

  • 0
    Было бы намного лучше уменьшить ваш вопрос, просто поместив ваш код, ваш результат или ошибку и результат, который вы ищете, большинство пользователей, помогающих здесь, смогут отследить, что пошло не так между кодом и выводом, а также предоставить новый маршрут
  • 0
    remove списка выполняет тесты на равенство. Булевы тесты для массивов производят логические массивы, одно значение на элемент массива. Вот где возникает ошибка неоднозначности.
Теги:
numpy
dictionary

1 ответ

0
Лучший ответ

remove использует тест равенства. Такой тест на массивах отличается от списков.

список удалить:

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

array remove - ваша ошибка

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 работы, если я ссылаюсь на массив по местоположению. Сравнение первых тестов:

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

Но если идентификаторы не совпадают, то они продолжают проверять значения. Но логические тесты на массивах производят логические массивы:

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']]

Если идентификатор списка совпадает, он может быть удален. Но если они не прибегают к сравнению элементов по элементам. Но когда один из этих элементов является массивом, он сталкивается с проблемой двусмысленности.

  • 0
    В моем коде 2-й цикл for выполняет итерацию по ссылке на список словаря open_nodes [keylist [0]], и поэтому item фактически ссылается на каждый элемент в этом списке. Итак, я не должен получать эту ошибку. Мой код находится внутри другого цикла, и это прекрасно работает для первых двух итераций внешнего цикла, что еще более странно. Я разместил весь код выше.
  • 0
    Ошибка часто встречается в SO и всегда связана с каким-то логическим тестом, включающим массив. Список и item при ошибке содержат массивы.
Показать ещё 4 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню