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?

17
demandé sur thefourtheye 2014-04-02 05:43:13

5 réponses

vous pouvez simplement supprimer l'élément approprié de chaque ligne en utilisant del:

L = [[1,2,3,4],
     [5,6,7,8],
     [9,1,2,3]]

for row in L:
    del row[1]  # 0 for column 1, 1 for column 2, etc.

print L
# outputs [[1, 3, 4], [5, 7, 8], [9, 2, 3]]
13
répondu arshajii 2015-02-07 21:20:36

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

5
répondu kojiro 2017-05-23 10:31:20

Utiliser map-lambda:

print map(lambda x: x[:1]+x[2:], L)
4
répondu idanshmu 2014-04-02 06:40:01

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.

3
répondu thefourtheye 2014-04-02 01:59:23

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
2
répondu Hai Vu 2014-04-02 01:55:29