Python - проблема с использованием списка записей frozenset в цикле for

Я пытаюсь изучить алгоритм априорного машинного обучения из книги, в которой используется Python, и как часть этого обучения я в настоящее время застрял с этой следующей проблемой:

Следующая конструкция кода работает нормально:

Ck = [[1], [2], [3], [4], [5]]
    for tranid in range(10): 
        for candidate in Ck:
            print("Printing candidate value: ", candidate)

Однако следующее не работает:

Ck = [[1], [2], [3], [4], [5]]
Ck2 = map(frozenset, Ck)
    for tranid in range(10): 
        for candidate in Ck2:
            print("Printing candidate value: ", candidate)

Когда я отображаю каждый элемент моего исходного итерируемого объекта в морозильное устройство, я замечаю, что внутренний цикл ("для кандидата в Ck2") выполняется только один раз. После этого он никогда не выполняется. Приведенный выше код без заморозки правильно повторяет внутренний цикл 10 раз. Однако с отображением frozenset внутренний цикл можно выполнить только один раз.

Пожалуйста, помогите мне исправить это. Книга сопоставила итеративные значения с frozenset, потому что они не хотят, чтобы он был изменяемым для целей алгоритма. Я просто пытаюсь следовать этому как есть.

Я использую Python 3.5.1 на Anaconda (Spyder).

Пожалуйста, помогите, так как я новичок в Python и машинного обучения.

Спасибо и всего наилучшего, Махеш.

2 ответа

Оператор map не возвращает список в python3, который вы можете повторять итеративно, а одноразовый итератор. В python3.x, map работает аналогично itertools.imap в python2.x.

Чтобы решить проблему, используйте

 Ck2=list(map(frozenset, Ck)))

и посмотрите Получение карты (), чтобы получить список в Python 3.x для получения дополнительной информации и других решений.

В python2.x, map Функция возвращает список. В python3.x map Функция возвращает объект карты, итеративный объект. Действительно, итератор. Когда вы запускаете внутреннюю for Если цикл повторяется один раз, итератор завершится, поэтому вы не сможете получить значение из него. В Python 2.x вы можете получать значения из списка много раз.

Вы должны изменить его на:

Ck = [[1], [2], [3], [4], [5]]
for tranid in range(10): 
    Ck2 = map(frozenset, Ck)
    for candidate in Ck2:
        print("Printing candidate value: ", candidate)
Другие вопросы по тегам