2013-04-08 20 views
16

Ich erhalte den FehlerTypeerror: 'Filter' Objekt ist subscriptable nicht

TypeError: 'filter' object is not subscriptable 

Beim Versuch, den folgenden Codeblock

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

Und

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

Der Fehler laufen tritt an der Linie

auf

Ich entschuldige mich, dass diese Art von Frage auf SO viele Male gepostet wurde, aber ich bin ziemlich neu in Python und verstehe Wörterbücher nicht vollständig. Versuche ich, ein Wörterbuch so zu verwenden, dass es nicht verwendet werden sollte, oder sollte ich ein Wörterbuch verwenden, in dem ich es nicht verwende? Ich weiß, dass die Lösung wahrscheinlich sehr einfach ist (wenn auch nicht für mich), und ich wäre sehr dankbar, wenn mir jemand in die richtige Richtung zeigen könnte.

Noch einmal, ich entschuldige mich, wenn diese Frage bereits

Dank beantwortet wurde,

Chris.

Ich benutze Python IDLE 3.3.1 unter Windows 7 64-Bit.

Antwort

25

filter() In Python 3 tut nicht eine Liste zurückgeben, aber ein iterable filter Objekt. Rufen Sie next() auf den ersten gefiltert Artikel zu erhalten:

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

Es gibt keine Notwendigkeit, sie in eine Liste zu konvertieren, da Sie nur den ersten Wert verwenden.

+9

So frustrierend zu erinnern, wenn diese Sprache OO ist und wenn es verfahrens - warum nicht 'iterable.next()' statt 'next (iterable) '? – Basic

+4

@Basic: '.next()' ist die Hook-Methode, 'next()' die API stdlib. Wie 'len()' vs. '.__ len __()', 'str()' vs. '.__ str __()' usw. In Python 3 wurde die '.next()' Methode in '.__ next __() umbenannt. '; Es war ein Fehler, ihm keinen speziellen Methodennamen zu geben. Mit 'next() '(die Funktion) können Sie auch einen Standardwert angeben, der zurückgegeben werden soll, wenn' StopIteration' ausgelöst wird. –

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

Verwenden list vor filter condtion dann funktioniert es gut. Für mich hat es das Problem gelöst.

Zum Beispiel

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

statt

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