Сообщение об ошибке: объект «список» не вызывается в python3 - PullRequest
0 голосов
/ 22 октября 2018

Я работаю над циклическим кроссовером в Генетическом алгоритме.Идея заключается в том, что для данного родителя [4,1,6,2,3,5,8,9,7,10], [1,2,3,4,5,6,7,8,9,10] я должен получить от него дочерний элемент. Может ли кто-нибудь сказать мне, почему в следующем коде написано «TypeError: объект list» не вызывается »

import numpy as np
import random
from itertools import cycle, permutations


def cx(individual):
    c = {i+1: individual[i] for i in range(len(individual))}
    cycles = []
    xx = sorted(individual)
    newArray = np.array([xx,individual])

    while c:
        elem0 = next(iter(c)) # arbitrary starting element
        this_elem = c[elem0]
        next_item = c[this_elem]

        cycle = []
        while True:
            cycle.append(this_elem)
            del c[this_elem]
            this_elem = next_item
            if next_item in c:
                next_item = c[next_item]
            else:
                break

        cycles.append(cycle)

    #return cycles
    return [[d[i] for i in range(len(d))] for l in permutations(newArray) for d in ({p[n]: n for s, p in zip(c, cycle({n: i for i, n in enumerate(s)} for s in l)) for n in s},)]

print (cx([4,1,6,2,3,5,8,9,7,10]))

Я ожидаю, что он вернется [[1, 2, 6, 4, 3, 5, 7, 8, 9, 10], [4, 1, 3, 2, 5, 6, 8, 9, 7, 10]]

1 Ответ

0 голосов
/ 22 октября 2018

Отладка 101:

1822:~/mypy$ python3 stack52920742.py 
Traceback (most recent call last):
  File "stack52920742.py", line 32, in <module>
    print (cx([4,1,6,2,3,5,8,9,7,10]))
  File "stack52920742.py", line 30, in cx
    return [[d[i] for i in range(len(d))] for l in permutations(newArray) for d in ({p[n]: n for s, p in zip(c, cycle({n: i for i, n in enumerate(s)} for s in l)) for n in s},)]
  File "stack52920742.py", line 30, in <listcomp>
    return [[d[i] for i in range(len(d))] for l in permutations(newArray) for d in ({p[n]: n for s, p in zip(c, cycle({n: i for i, n in enumerate(s)} for s in l)) for n in s},)]
TypeError: 'list' object is not callable

Мы хотим увидеть трассировку, а не только сообщение об ошибке.Нам нужно знать, ГДЕ возникает ошибка, а не просто, как говорится.

Ошибка означает, что некоторая переменная, имеющая значение list, обрабатывается так, как если бы она былафункция.То есть за списком следует (...).Списки не являются функциями, они не callable.Их можно индексировать только в том случае, если в Python используется синтаксис [].

Вероятным кандидатом является

cycle({n: i for i, n in enumerate(s)} for s in l)

. Похоже, он вызывает функцию cycle с кортежемсловари.Но если бы cycle был списком, он бы выдал эту ошибку.

Что такое cycle?

from itertools import cycle

, но также

cycle = []

Очевидно, второе назначениепереписывает первый.

Если я переименую этот внутренний cycle во что-то вроде alist, он запустится, хотя печать будет

[[], []]

cycles, перед длинным return будет

[[4, 2, 1], [6, 5, 3], [8, 9, 7], [10]]

Почему cx выполняет всю работу, создает этот список cycles, а затем никогда не использует его?

Вы просто скопировали функцию из какого-то места, но не отладилиэто?

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