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)