2013-04-08 12 views
16

sto ricevendo l'erroreTypeError: 'filtro' oggetto non viene subscriptable

TypeError: 'filter' object is not subscriptable 

Quando si tenta di eseguire il seguente blocco di codice

bonds_unique = {} 
for bond in bonds_new: 
    if bond[0] < 0: 
     ghost_atom = -(bond[0]) - 1 
     bond_index = 0 
    elif bond[1] < 0: 
     ghost_atom = -(bond[1]) - 1 
     bond_index = 1 
    else: 
     bonds_unique[repr(bond)] = bond 
     continue 
    if sheet[ghost_atom][1] > r_length or sheet[ghost_atom][1] < 0: 
     ghost_x = sheet[ghost_atom][0] 
     ghost_y = sheet[ghost_atom][1] % r_length 
     image = filter(lambda i: abs(i[0] - ghost_x) < 1e-2 and 
         abs(i[1] - ghost_y) < 1e-2, sheet) 
     bond[bond_index] = old_to_new[sheet.index(image[0]) + 1 ] 
     bond.sort() 
     #print >> stderr, ghost_atom +1, bond[bond_index], image 
    bonds_unique[repr(bond)] = bond 

# Removing duplicate bonds 
bonds_unique = sorted(bonds_unique.values()) 

E

sheet_new = [] 
bonds_new = [] 
old_to_new = {} 
sheet=[] 
bonds=[] 

L'errore si verifica alla linea

bond[bond_index] = old_to_new[sheet.index(image[0]) + 1 ] 

Mi scuso per il fatto che questo tipo di domanda è stato pubblicato su SO molte volte, ma sono abbastanza nuovo per Python e non capisco perfettamente i dizionari. Sto cercando di usare un dizionario in un modo in cui non dovrebbe essere usato, o dovrei usare un dizionario dove non lo sto usando? So che la correzione è probabilmente molto semplice (anche se non per me) e sarò molto grato se qualcuno mi indicasse la giusta direzione.

Ancora una volta, mi scuso se questa domanda è stato risposto già

Grazie,

Chris.

Sto usando Python IDLE 3.3.1 su Windows 7 a 64 bit.

risposta

25

filter() in Python 3 non non restituire un elenco, ma un filter oggetto iterabile. Chiamare next() su di esso per ottenere l'oggetto filtrato primo:

bond[bond_index] = old_to_new[sheet.index(next(image)) + 1 ] 

Non v'è alcuna necessità di convertirlo in un elenco, come si usa solo il primo valore.

+9

così frustrante da ricordare quando questo linguaggio è OO e quando è procedurale - perché no 'iterable.next()' invece di 'prossimo (iterable) '? – Basic

+4

@Basic: '.next()' è il metodo di aggancio, 'next()' l'API di stdlib. Come 'len()' vs. '.__ len __()', 'str()' vs. '.__ str __()', ecc. In Python 3 il metodo '.next()' è stato rinominato '.__ next __() '; è stato un errore non dargli un nome di metodo speciale. 'next()' (la funzione) consente anche di specificare un valore predefinito da restituire se viene visualizzato 'StopIteration'. –

2
image = list(filter(lambda i: abs(i[0] - ghost_x) < 1e-2 and abs(i[1] - ghost_y) < 1e-2, sheet)) 
0

Usa list prima filter condtion poi funziona benissimo. Per me ha risolto il problema.

Per esempio

list(filter(lambda x: x%2!=0, mylist)) 

invece di

filter(lambda x: x%2!=0, mylist) 
Problemi correlati