Подтвердить что ты не робот

Удалить столбец из вложенного списка в Python

Мне нужна помощь в том, как работать с удалением столбца из вложенного списка, чтобы изменить его.

Скажем, у меня

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

и я хочу удалить второй столбец (так что значения 2,6,1), чтобы получить:

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

Я застрял в том, как изменить список, просто вытащив столбец. Раньше я делал что-то вроде этого? За исключением того, что мы его печатали, и, конечно, это не сработало бы в этом случае, потому что я считаю, что разрыв противоречит остальным значениям, которые я хочу в списке.

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

Итак, как бы вы изменили этот вложенный список? Мой разум в правильном месте сравнивает его с кодом, который я опубликовал, или для этого требуется что-то другое?

4b9b3361

Ответ 1

Вы можете просто удалить соответствующий элемент из каждой строки, используя 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]]

Ответ 2

Если вы хотите извлечь этот столбец для последующего использования, удалив его из исходного списка, используйте понимание списка с помощью 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]]

В противном случае просто перейдите по списку и удалите поля, которые вам больше не нужны, как в arshajii answer

Ответ 3

Используйте map-lambda:

print map(lambda x: x[:1]+x[2:], L)

Ответ 4

Вот один из способов, обновленный, чтобы принять совет kojiro.

>>> L[:] = [i[:1]+i[2:] for i in L]
>>> L
[[1, 3, 4], [5, 7, 8], [9, 2, 3]]

Вы можете обобщить это, чтобы удалить любой столбец:

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

Ответ 5

Вы можете использовать operator.itemgetter, который создается именно для этой цели.

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]]

Вы можете использовать его в понимании List следующим образом

print([list(getter(item)) for item in L])
# [[1, 3, 4], [5, 7, 8], [9, 2, 3]]

Вы также можете использовать вложенное List Consrehension, в котором мы пропускаем элементы, если индекс равен 1, например

print([[item for index, item in enumerate(items) if index != 1] for items in L])
# [[1, 3, 4], [5, 7, 8], [9, 2, 3]]

Примечание. Все эти предложения, предложенные в этом ответе, не будут влиять на исходный список. Они будут генерировать новые списки без нежелательных элементов.