2010-07-01 4 views
6

Je ne suis qu'un débutant en python et je veux savoir s'il est possible de supprimer toutes les valeurs entières d'une liste? Par exemple le document va commeComment supprimer toutes les valeurs entières d'une liste en python

['1','introduction','to','molecular','8','the','learning','module','5'] 

Après la suppression, je veux que le document à ressembler à:

['introduction','to','molecular','the','learning','module'] 

Répondre

20

Pour supprimer tous les entiers, faites ceci:

no_integers = [x for x in mylist if not isinstance(x, int)] 

Cependant, votre exemple liste ne contient pas réellement d'entiers. Il contient uniquement des chaînes, dont certaines sont composées uniquement de chiffres. Pour filtrer les sortir, procédez comme suit:

no_integers = [x for x in mylist if not (x.isdigit() 
             or x[0] == '-' and x[1:].isdigit())] 

Alternativement:

is_integer = lambda s: s.isdigit() or (x[0] == '-' and x[1:].isdigit()) 
no_integers = filter(is_integer, mylist) 
+0

si vous souhaitez modifier la liste en place plutôt que de créer une liste, cela peut être fait avec une boucle simple. – tlayton

+1

Le nombre est négatif isdigit() ne fonctionnera pas. – razpeitia

+0

@mykhal Juste vérifier, est-ce une blague? Il fonctionne bien sur les nombres à plusieurs chiffres, bien sûr – JAL

8

Aucun des articles dans votre liste sont des nombres entiers. Ce sont des chaînes qui ne contiennent que des chiffres. Vous pouvez donc utiliser la méthode de chaîne isdigit pour filtrer ces éléments.

items = ['1','introduction','to','molecular','8','the','learning','module','5'] 

new_items = [item for item in items if not item.isdigit()] 

print new_items 

Lien vers la documentation: http://docs.python.org/library/stdtypes.html#str.isdigit

11

Vous pouvez faire cela aussi:

def int_filter(someList): 
    for v in someList: 
     try: 
      int(v) 
      continue # Skip these 
     except ValueError: 
      yield v # Keep these 

list(int_filter(items)) 

Pourquoi? Parce que int est mieux que d'essayer d'écrire des règles ou des expressions régulières pour reconnaître les valeurs de chaîne qui codent un entier.

+0

Pourquoi 'int' est-il meilleur que' str.isdigit'? –

+5

Comme d'autres l'ont fait remarquer, '-2'.isdigit()' retournera 'False'. –

+0

+1. Voir http://stackoverflow.com/questions/354038/checking-if-string-is- number-python pour la discussion (avec 'float', mais toujours aussi pertinent). – Brian

0

S'il vous plaît ne pas utiliser cette façon de supprimer des éléments d'une liste: (modifiée après commentaire par THC4k)

>>> li = ['1','introduction','to','molecular','8','the','learning','module','5'] 
>>> for item in li: 
     if item.isdigit(): 
      li.remove(item) 

>>> print li 
['introduction', 'to', 'molecular', 'the', 'learning', 'module'] 

Cela ne fonctionnera pas depuis la modification d'une liste en itérer sur elle confondra la boucle for. En outre, item.isdigit() ne fonctionnera pas si l'élément est une chaîne contenant un entier négatif, comme indiqué par razpeitia.

+0

Python a vraiment besoin d'un mécanisme pour empêcher les gens de le faire. On dirait que ça marcherait, mais ça ne marche pas - essayez avec 'li = ['iterating + remove -> skipping', '4', '5', 'voir?']' (La suppression de 4 sautera le 5, donc il reste dans la liste) –

1

Vous pouvez également utiliser lambdas (et, évidemment, récursivité), pour y parvenir (Python 3 nécessaire):

isNumber = lambda s: False if (not(s[0].isdigit()) and s[0]!='+' and s[0]!='-') else isNumberBody(s[ 1:]) 

isNumberBody = lambda s: True if len(s) == 0 else (False if (not(s[0].isdigit()) and s[0]!='.') else isNumberBody(s[ 1:])) 

removeNumbers = lambda s: [] if len(s) == 0 else (([s[0]] + removeNumbers(s[1:])) if (not(isInteger(s[0]))) else [] + removeNumbers(s[ 1:])) 

l = removeNumbers(["hello", "-1", "2", "world", "+23.45"]) 
print(l) 

Résultat (affiché à partir 'l') sera: [ 'bonjour', 'monde']

+0

Cela ne fonctionne pas avec les nombres négatifs. – JAL

+0

Eh bien, oui, mais il serait trivial de changer ce code pour obtenir ce comportement. – Baltasarq

+0

Fait, maintenant il gère les nombres négatifs. – Baltasarq

3

J'aime personnellement le filtre. Je pense que cela peut aider à garder un code lisible et conceptuellement simple si elle est utilisée de manière judicieuse:

x = ['1','introduction','to','molecular','8','the','learning','module','5'] 
x = filter(lambda i: not str.isdigit(i), x) 

ou

from itertools import ifilterfalse 
x = ifilterfalse(str.isdigit, x) 

Notez la seconde renvoie un itérateur.

0

Vous pouvez utiliser le filter intégré pour obtenir une copie filtrée d'une liste.

>>> the_list = ['1','introduction','to','molecular',-8,'the','learning','module',5L] 
>>> the_list = filter(lambda s: not str(s).lstrip('-').isdigit(), the_list) 
>>> the_list 
['introduction', 'to', 'molecular', 'the', 'learning', 'module'] 

Ce qui précède peut gérer une variété d'objets en utilisant la conversion de type explicite.Puisque presque tous les objets Python peuvent être légalement convertis en une chaîne, ici, filter prend une copie str-convertie pour chaque membre de la liste, et vérifie si la chaîne (moins tout caractère '-') est un chiffre numérique. Si c'est le cas, le membre est exclu de la copie retournée.

The built-in functions are very useful. Ils sont tous hautement optimisés pour les tâches pour lesquelles ils sont conçus et ils vous éviteront de réinventer des solutions.

0

Pour supprimer tous les entiers de la liste

ls = ['1','introduction','to','molecular','8','the','learning','module','5'] 
ls_alpha = [i for i in ls if not i.isdigit()] 
print(ls_alpha) 
Questions connexes