2017-05-05 5 views
1

J'ai une liste commeComment supprimer les valeurs d'une liste de la liste en Python

[['Name', 'Place', 'Batch'], ['11', '', 'BBI', '', '2015'], ['12', '', 'CCU', '', '', '', '', '2016'], ['13', '', '', 'BOM', '', '', '', '', '2017']] 

Je veux supprimer tous les « » de la liste.

Le code que j'ai essayé est:

>>> for line in list: 
...  if line == '': 
...   list.remove(line) 
... 
print(list) 

La sortie qu'il montre est:

[['Name', 'Place', 'Batch'], ['11', '', 'BBI', '', '2015'], ['12', '', 'CCU', '', '', '', '', '2016'], ['13', '', '', 'BOM', '', '', '', '', '2017']] 

Quelqu'un peut-il suggérer ce qui ne va pas avec ça?

+0

Où les listes imbriquées viennent? Il vaudrait mieux les créer sans le ''' 'en premier lieu. – mkrieger1

+0

@ mkrieger1 J'ai un fichier brut qui n'est pas correctement délimité. J'ai converti en liste et donc la sortie. Je voulais supprimer ces valeurs indésirables. –

+1

Ce que je veux dire, c'est: Si vous nous avez montré * comment * vous avez créé les listes, nous pourrions probablement vous dire comment vous pouvez * éviter * les entrées '''', et vous n'auriez pas besoin de les supprimer à nouveau. – mkrieger1

Répondre

4

C'est ce que vous voulez:

a = [['Name', 'Place', 'Batch'], ['11', '', 'BBI', '', '2015'], ['12', '', 'CCU', '', '', '', '', '2016'], ['13', '', '', 'BOM', '', '', '', '', '2017']] 
b = [[x for x in y if x != ''] for y in a] # kudos @Moses 
print(b) # prints: [['Name', 'Place', 'Batch'], ['11', 'BBI', '2015'], ['12', 'CCU', '2016'], ['13', 'BOM', '2017']] 

Votre solution ne fonctionne pas parce que line devient l'ensemble de la sous-liste dans toutes les étapes et non pas les éléments de la sous-liste.

Il semble maintenant que vous essayez de modifier la liste d'origine sur place (sans créer de variables supplémentaires). C'est une noble cause mais faire une boucle sur une liste que vous modifiez lorsque vous êtes en boucle n'est pas conseillée et conduira probablement votre code à élever une erreur (IndexError ou autre).

Enfin, ne pas utiliser le nom list depuis Python utilise en interne et vous écrasez son utilisation destiné.

+2

Un test explicite pourrait être meilleur, car il filtre toutes les valeurs * falsy * –

+0

@MosesKoledoye True. Merci! –

2

Vous exécutez votre test sur les sous-listes et non sur les articles qu'ils contiennent. Et vous aurez besoin d'un for imbriqué pour faire ce que vous voulez. Cependant, supprimer des éléments d'une liste avec list.remove pendant l'itération entraîne généralement des résultats imprévisibles.

Vous pouvez cependant utiliser une compréhension de liste pour filtrer les chaînes vides:

r = [[i for i in x if i != ''] for x in lst] 
#      ^^ filter condition