web-dev-qa-db-fra.com

TypeError: l'objet 'filter' n'est pas indexable

Je reçois l'erreur

TypeError: 'filter' object is not subscriptable

Lorsque vous essayez d'exécuter le bloc de code suivant

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

Et

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

L'erreur se produit sur la ligne

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

Je m'excuse que ce type de question a été posté sur SO plusieurs fois, mais je suis assez nouveau pour Python et je ne comprends pas complètement les dictionnaires. Suis-je en train d'essayer utiliser un dictionnaire d'une manière qui ne devrait pas être utilisé, ou devrais-je utiliser un dictionnaire où je ne l'utilise pas? Je sais que le correctif est probablement très simple (mais pas pour moi), et je serai très reconnaissant si quelqu'un pouvait me diriger dans la bonne direction.

Encore une fois, je m'excuse s'il a déjà été répondu à cette question

Merci,

Chris.

J'utilise Python IDLE 3.3.1 sur Windows 7 64 bits.

34

filter() in python 3 ne pas retourne une liste, mais un objet filter itérable. Appelez next() dessus pour obtenir le premier élément filtré:

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

Il n'est pas nécessaire de le convertir en liste, car vous n'utilisez que la première valeur.

46
Martijn Pieters

Utilisez list avant filter condtion alors ça marche bien. Pour moi, cela a résolu le problème.

Par exemple

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

au lieu de

filter(lambda x: x%2!=0, mylist)
23
K Kotagaram
image = list(filter(lambda i: abs(i[0] - ghost_x) < 1e-2 and abs(i[1] - ghost_y) < 1e-2, sheet))
3
DKZ