Значение TrueError истина неоднозначно при удалении значения из списка, которые являются значениями словаря - PullRequest
0 голосов
/ 20 сентября 2018

Я тестировал этот кусок кода:

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 () прекрасно удаляет список из списка значенийсловарь.

Я реализовал аналогичную структуру, где ключи являются эвристическими значениями, а значения являются списком списка.Внутренний список состоит из массива и строки.Например:

[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

1 Ответ

0 голосов
/ 20 сентября 2018

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

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

Списки и массивы во многом похожи, но обычно не являются взаимозаменяемыми заменами друг друга.

edit

То же самое относится, когда массивы вложены в списки.Использование ваших последних отпечатков:

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

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...