TypeError: l'objet 'filter' n'est pas sous -criptable
je reçois l'erreur
TypeError: 'filter' object is not subscriptable
en essayant 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 à la ligne
bond[bond_index] = old_to_new[sheet.index(image[0]) + 1 ]
Je m'excuse que ce type de question ait été posté tellement de fois, mais je suis assez nouveau en Python et je ne comprends pas parfaitement les dictionnaires. Est-ce que j'essaie d'utiliser un dictionnaire d'une manière qui ne devrait pas être utilisée, ou devrais-je utiliser un dictionnaire où je ne suis pas en l'utilisant? Je sais que la solution 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 si cette question a déjà répondu
Merci,
Chris.
j'utilise Python IDLE 3.3.1 sur Windows 7 64-bit.
3 réponses
filter()
en python 3 fait retourner une liste, mais un filter
objet. Appeler next()
sur elle pour obtenir le premier objet filtré:
bond[bond_index] = old_to_new[sheet.index(next(image)) + 1 ]
Il n'est pas nécessaire de les convertir en une liste, que vous utilisez uniquement la première valeur.
Utiliser list
avant filter
condtion alors ça marche très bien. Pour moi, il 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))