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.
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.
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)
image = list(filter(lambda i: abs(i[0] - ghost_x) < 1e-2 and abs(i[1] - ghost_y) < 1e-2, sheet))