2017-08-30 2 views
0

J'ai un tableau 2D comme celui-ci:Déposez un élément d'une liste (drop ligne de la liste des listes)

list_of_data = [ 
    ['Joe', 4, 4, 4, 5, 'cabbage', None], 
    ['Joe', 43, '2TM', 41, 53, 'cabbage', None], 
    ['Joe', 24, 34, 44, 55, 'cabbage', None], 
    ['Joe', 54, 37, 42, 85, 'cabbage', None], 

    ['Tom', 7, '2TM', 4, 52, 'cabbage', None], 
    ['Tom', 4, 24, 43, 52, 'cabbage', None], 
    ['Tom', 4, 4, 4, 5, 'cabbage', None], 

    ['Fred', 4, 4, 4, 5, 6, 'cabbage'], 
    ['Fred', 4, 4, 4, 5, 6, 'cabbage'], 
    ['Fred', 4, 4, 4, 5, 6, 'cabbage'], 
] 

Je suis intéressé par les lignes contenant la valeur '2TM' à son 2ème indice. Par exemple:

  • Joe a la valeur '2TM' à l'index 2 dans la 2ème apparition de ses données.
  • Tom a la valeur '2TM' à l'index 2 lors de la première apparition de ses données.

Chaque fois que la valeur '2TM' apparaît dans les données, je veux supprimer les deux lignes suivantes. L'exemple ci-dessus deviendrait le suivant:

list_of_data = 
    ['Joe', 4, 4, 4, 5, 'cabbage', None], 
    ['Joe', 43, '2TM', 41, 53, 'cabbage', None], 

    ['Tom', 7, '2TM', 4, 52, 'cabbage', None], 

    ['Fred', 4, 4, 4, 5, 6, 'cabbage'], 
    ['Fred', 4, 4, 4, 5, 6, 'cabbage'], 
    ['Fred', 4, 4, 4, 5, 6, 'cabbage'], 
] 

J'ai essayé d'utiliser list.pop comme ceci:

for row[x] in list_of_data: 
    if '2TM' in row: 
     list_of_data.pop[x+1:x+2] 

Répondre

1

Vous devez faire quelque chose comme ça

list_of_data = [['Joe', 4, 4, 4, 5, 'cabbage', None], 
['Joe', 43,'2TM', 41, 53, 'cabbage', None], 
['Joe', 24, 34, 44, 55, 'cabbage', None], 
['Joe', 54, 37, 42, 85, 'cabbage', None], 

['Tom', 7,'2TM', 4, 52, 'cabbage', None], 
['Tom', 4, 24, 43, 52, 'cabbage', None], 
['Tom', 4, 4, 4, 5, 'cabbage', None], 

['Fred', 4, 4, 4, 5, 6, 'cabbage'], 
['Fred', 4, 4, 4, 5, 6, 'cabbage'], 
['Fred', 4, 4, 4, 5, 6, 'cabbage']] 
x=0 
for row in list_of_data: 
    if '2TM' in row: 
     list_of_data.pop(x+1) 
     list_of_data.pop(x+1) 
    x+=1 
print(list_of_data) 

Vous étiez assez proche mais juste raté l'incrément de x.

+0

'list.pop' échouera s'il n'y a pas deux lignes (ou même une) après la ligne contenant' '2TM''. Par exemple, si la dernière ligne (ou l'avant-dernière) de 'list_of_data' contenait un« 2TM »,' list.pop' soulèverait une exception. –

+0

Il a mentionné que les deux prochaines lignes doivent être supprimées. Bien qu'une vérification puisse être appliquée pour les dernières lignes –

+1

@ZachGates Je comprends votre objection ici. Et à des fins générales, vous avez raison: cette méthode soulèverait une objection dans le scénario que vous décrivez. Cependant, la nature inhérente/unique de mon ensemble de données est que chaque fois que 2TM apparaît dans mes données, il y a toujours 2 lignes à supprimer. Donc, cette méthode .pop a effectivement fonctionné pour mes données, même si elle ne fonctionne pas à des fins générales. – TJE

1

utiliser une boucle while:

index = 0 

while index < len(list_of_data): 
    if list_of_data[index][2] == '2TM': 
     # check if the names are the same, as needed 
     del list_of_data[index + 1:index + 3] 

    index += 1 
+1

Cette méthode fonctionne aussi bien que celle ci-dessous. Merci beaucoup pour votre contribution. – TJE