Supprimer une colonne d'une liste imbriquée en Python
j'ai besoin d'aide pour comprendre comment travailler autour de la suppression d'une colonne " à partir d'une liste imbriquée à le modifier.
Dis-je
L = [[1,2,3,4],
[5,6,7,8],
[9,1,2,3]]
et je veux enlever la deuxième colonne (de sorte que les valeurs 2,6,1) pour obtenir:
L = [[1,3,4],
[5,7,8],
[9,2,3]]
je suis coincé avec la façon de modifier la liste en sortant juste une colonne. J'ai fait quelque chose comme ça avant? Sauf que nous l'imprimions à la place, et bien sûr ça ne marcherait pas dans ce cas parce que je crois que la pause est en conflit avec le reste des valeurs que je veux dans la liste.
def L_break(L):
i = 0
while i < len(L):
k = 0
while k < len(L[i]):
print( L[i][k] , end = " ")
if k == 1:
break
k = k + 1
print()
i = i + 1
alors, comment feriez-vous pour modifier cette liste emboîtée? Est-ce que mon esprit est au bon endroit pour le comparer au code que j'ai posté ou est-ce que cela nécessite quelque chose de différent?
5 réponses
Si vous voulez extrait cette colonne pour une utilisation ultérieure, tout en la retirant de la liste originale, utilisez une liste de compréhension avec pop
:
>>> L = [[1,2,3,4],
... [5,6,7,8],
... [9,1,2,3]]
>>>
>>> [r.pop(1) for r in L]
[2, 6, 1]
>>> L
[[1, 3, 4], [5, 7, 8], [9, 2, 3]]
sinon, bouclez la liste et supprimez les champs que vous ne voulez plus, comme dans réponse d'arshajii
Vous pouvez utiliser operator.itemgetter
, qui est créé dans ce but.
from operator import itemgetter
getter = itemgetter(0, 2, 3) # Only indexes which are needed
print(list(map(list, map(getter, L))))
# [[1, 3, 4], [5, 7, 8], [9, 2, 3]]
Vous pouvez l'utiliser dans la compréhension de Liste comme ceci
print([list(getter(item)) for item in L])
# [[1, 3, 4], [5, 7, 8], [9, 2, 3]]
vous pouvez également utiliser la compréhension de liste imbriquée, dans laquelle nous sautons les éléments si l'index est 1, comme ceci
print([[item for index, item in enumerate(items) if index != 1] for items in L])
# [[1, 3, 4], [5, 7, 8], [9, 2, 3]]
Remarque: tous ceux suggérés dans cette réponse n'affecteront pas la liste originale. Ils généreront de nouvelles listes sans les éléments indésirables.
voici un moyen, mis à jour pour prendre en compte les conseils de kojiro.
>>> L[:] = [i[:1]+i[2:] for i in L]
>>> L
[[1, 3, 4], [5, 7, 8], [9, 2, 3]]
vous pouvez généraliser ceci pour supprimer n'importe quelle colonne:
def remove_column(matrix, column):
return [row[:column] + row[column+1:] for row in matrix]
# Remove 2nd column
copyofL = remove_column(L, 1) # Column is zero-base, so, 1=second column