python-AttributeError: obiectul ‘NoneType’ nu are atributul ‘remove’ (Programare, Python)

Arshad Ahmad a intrebat.

Am o listă 3D în python ca:

features= [ [[1,2,3],[1,2,3],[1,2,3]] ,None , [[1,2,3],[1,2,3],[1,2,3]],
        [[1,2,3],[1,2,3],[1,2,3]], None,None,[[1,2,3],[1,2,3],[1,2,3]] ]

Mă aștept să văd:

features=[ [[1,2,3],[1,2,3],[1,2,3]] ,[[1,2,3],[1,2,3],[1,2,3]],
               [[1,2,3],[1,2,3],[1,2,3]] ,[[1,2,3],[1,2,3],[1,2,3]] ]

Când încerc să elimin None folosind următorul cod:

for i in range(len(features)):
if features[i]==None:
    features[i].remove()

Se produce eroarea :

AttributeError: Obiectul ‘NoneType’ nu are atributul ‘remove’.

Dacă încerc acest lucru:

for i in range(len(features)):
if features[i]==None:
    del features[i]

Se produce eroarea:

ValueError: Valoarea de adevăr a unui array cu mai multe elemente este ambiguă. Utilizați a.any() sau a.all()

În cele din urmă am încercat acest cod:

for i in range(len(features)):
if features[i]==None:
    features[i]=filter(None,features[i])

A produs eroarea :-

TypeError: obiectul ‘NoneType’ nu este iterabil.

Cum pot remedia această eroare?

Comentarii

  • Nu modificați o listă pe care o iterați în acel moment.… –  > Por Willem Van Onsem.
  • Răspuns de tip șablon: Întrebările care solicită ajutor pentru depanare („de ce nu funcționează acest cod?”) trebuie să includă în întrebare comportamentul dorit, o problemă sau eroare specifică și cel mai scurt cod necesar pentru a o reproduce. Întrebările fără o enunțare clară a problemei nu sunt utile pentru ceilalți cititori. A se vedea: Cum să creați un exemplu minim, complet și verificabil. –  > Por Oliver Baumann.
5 răspunsuri
Ajax1234

În primul tău bloc de cod, nu treci o valoare care să fie eliminată din listă. În al doilea bloc de cod, modificați lista în timpul iterației, producând astfel o locație denaturată index-vs-valoare. Cea mai bună metodă este să filtrați Nones din listă:

features= [ [[1,2,3],[1,2,3],[1,2,3]] ,None , [[1,2,3],[1,2,3],[1,2,3]],
    [[1,2,3],[1,2,3],[1,2,3]], None,None,[[1,2,3],[1,2,3],[1,2,3]] ]
final_features = list(filter(lambda x:x is not None, features))

Ieșire:

[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]

Comentarii

  • @ArshadAhmad mă bucur să vă ajut! Dacă acest răspuns v-a ajutat, vă rugăm să luați în considerare acceptarea lui. Vă mulțumim! –  > Por Ajax1234.
AK47

Creați o listă de înțelegere și păstrați valorile doar dacă indexul nu este None, vă va păstra sub-listele intacte:

features = [[[1, 2, 3], [1, 2, 3], [1, 2, 3]], None, [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], None, None, [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]

>>> print features 
[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], None, [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], None, None, [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]

>>> print [f for f in features if f is not None]
[[[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]], [[1, 2, 3], [1, 2, 3], [1, 2, 3]]]

Jan

Scurt și simplu:

features_x = list(filter(None, features))
print(features_x)

A se vedea o demonstrație pe ideone.com.

Comentarii

  • Am încercat deja că am primit, ValueError: Valoarea de adevăr a unui array cu mai multe elemente este ambiguă. Utilizați a.any() sau a.all() –  > Por Arshad Ahmad.
  • @ArshadAhmad: Decât că ați încercat altceva, vedeți demo-ul, codul funcționează. –  > Por Jan.
Jonathan

Așa cum spune willem, nu ar trebui să modificați niciodată o listă peste care iterați. Modul corect de a face este de a crea o nouă listă. Puteți face acest lucru cu o înțelegere a listei în felul următor.

 New = [item for item in mylist if item is not None]

kjmerf

Puteți încerca și în felul următor:

new_features = []

for f in features:
    if f is not None:
        new_features.append(f)

Tags: