2013-04-08 12 views
16

Otrzymuję błądTypeError: 'filtr' obiekt nie jest subscriptable

TypeError: 'filter' object is not subscriptable 

Gdy próbuje uruchomić następujący fragment kodu

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()) 

I

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

błędu występuje na linii

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

Przepraszam, że tego typu pytania były publikowane na SO wiele razy, ale jestem całkiem nowy w Pythonie i nie w pełni rozumiem słowniki. Czy staram się używać słownika w sposób, w jaki nie powinien on być używany, czy powinienem używać słownika, w którym go nie używam? Wiem, że poprawka jest prawdopodobnie bardzo prosta (choć nie dla mnie) i będę bardzo wdzięczny, jeśli ktoś wskaże mi właściwy kierunek.

Jeszcze raz przepraszam, jeśli kwestia ta została już odpowiedział

Dzięki,

Chris.

Używam Pythona IDLE 3.3.1 na Windows 7 64-bit.

Odpowiedz

25

filter() w python 3 ma nie zwraca listę, ale jest obiektem iteracyjnym filter. Zadzwoń next() na to, aby uzyskać przefiltrowaną element pierwszy:

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

Nie ma potrzeby, aby przekształcić go do listy, jak używać tylko pierwszą wartość.

+9

tak frustrujące, aby pamiętać, gdy język ten jest OO i kiedy to proceduralny - dlaczego nie 'iterable.next()' zamiast 'next (iterable) '? – Basic

+4

@Basic: '.next()' jest metodą przechwytującą, 'next()' stdlib API. Podobnie jak 'len()' vs. '.__ len __()', 'str()' vs. '.__ str_()', itp. W Pythonie 3 metoda '.next()' została zmieniona na '.__ next __() '; Błędem było nie nadawać mu nazwy specjalnej. 'next()' (funkcja) pozwala również określić wartość domyślną, która powróci po podniesieniu 'StopIteration'. –

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

Zastosowanie list przed filter Warunek to działa dobrze. Dla mnie to rozwiązało problem.

Na przykład

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

zamiast

filter(lambda x: x%2!=0, mylist) 
Powiązane problemy