2016-02-11 20 views
5

Próbuję nauczyć się algorytmu uczenia apriori z książki, która używa języka Python, a jako część tej nauki mam problem z następującym problemem:Python - problem z użyciem listy zamrożonych wpisów w pętli for

Kod następujący konstrukt wydaje się działać prawidłowo:

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

jednak następujące nie działa:

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

Kiedy map każdy element mojego pierwotnego ITER w stanie zamrożonym, zauważam, że wewnętrzna pętla ("dla kandydata w Ck2") jest wykonywana tylko raz. Potem nigdy się nie kończy. Powyższy kod bez zamrożonego zestawu poprawnie przepuszcza pętlę wewnętrzną 10 razy. Jednak przy zamrożonym zestawieniu, mogę wykonać wewnętrzną pętlę tylko raz.

Pomóż mi rozwiązać ten problem. Książka zmapowała wartości iterowalne na zamrożone, ponieważ nie chcą, aby były zmienne dla celów algorytmu. Po prostu staram się podążać za tym, jak jest.

Używam Python 3.5.1 na Anacondzie (Spyder).

Proszę o pomoc, ponieważ jestem nowy zarówno w Pythonie, jak i w uczeniu maszynowym.

Dzięki i Pozdrawiam, Mahesh.

Odpowiedz

5

Operator mapy nie zwraca listy w python3, którą można wielokrotnie powtórzyć, ale iteracyjnej iteracji jednorazowej. W python3.x, map działa podobnie do itertools.imap w python2.x.

Aby rozwiązać ten problem, należy użyć

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

i zobaczyć Getting a map() to return a list in Python 3.x uzyskać więcej informacji i innych rozwiązań.

+0

Oh wow, że pracował. Wielkie dzięki :) – user3755648

0

W python2.x, map funkcja zwraca listę. W python3.x map funkcja zwraca obiekt mapy, obiekt iterowalny. Rzeczywiście, iterator. Po uruchomieniu wewnętrznej pętli for jeden iterator zakończy działanie, więc nie można już uzyskać z niego wartości. W Pythonie 2.x możesz wielokrotnie uzyskiwać wartości z listy.

Należy zrewidować go:

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