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.

19
demandé sur Christopher John Scott 2013-04-08 13:57:30

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.

29
répondu Martijn Pieters 2013-04-08 09:59:24

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)
4
répondu K Kotagaram 2018-03-10 18:52:25
image = list(filter(lambda i: abs(i[0] - ghost_x) < 1e-2 and abs(i[1] - ghost_y) < 1e-2, sheet))
2
répondu DKZ 2016-06-25 17:23:32