2016-02-11 16 views
5

Sto cercando di imparare l'algoritmo apriori machine learning da un libro che utilizza Python e, come parte di tale apprendimento, attualmente sono bloccato con questo problema seguente:Python - problema con l'utilizzo di un elenco di voci frozenset in un ciclo for

il codice seguente costrutto sembra funzionare bene:

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

Tuttavia, il seguente non funziona:

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

Quando traccio ogni elemento del mio iter originale in grado di eseguire il frozenset, noto che il loop interno ("per candidato in Ck2") viene eseguito una sola volta. Dopo questo non si esegue mai. Il codice sopra senza il frozenset esegue correttamente il ciclo 10 volte attraverso il loop interno. Tuttavia, con frozenset mappato, posso ottenere il ciclo interno da eseguire solo una volta.

Please help me with fixing this. Il libro ha mappato i valori iterabili su frozenset perché non vogliono che sia mutabile ai fini dell'algoritmo. Sto semplicemente cercando di seguirlo così com'è.

Sto usando Python 3.5.1 su Anaconda (Spyder).

Si prega di aiutare, come sono nuovo a entrambi Python e Machine Learning.

Grazie e saluti, Mahesh.

risposta

5

L'operatore di mappa non restituisce un elenco in python3 che è possibile ripetere iteramente in modo ripetitivo, ma un iteratore iteratore ripetibile una sola volta . In python3.x, map funziona in modo simile a itertools.imap in python2.x.

Per risolvere il problema, utilizzare

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

e vedere Getting a map() to return a list in Python 3.x per ulteriori informazioni e altre soluzioni.

+0

Oh, wow, che ha funzionato. Molte grazie :) – user3755648

0

In python2.x, la funzione map restituisce un elenco. In python3.x la funzione map restituisce un oggetto mappa, un oggetto iterabile. In effetti, un iteratore. Quando si esegue il ciclo interno for per una volta, l'iteratore terminerà quindi non sarà più possibile ottenere il valore da esso. In python 2.x, è possibile ottenere valori da un elenco per molte volte.

Si dovrebbe rivedere a:

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