Удалить столбец из вложенного списка в 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
Итак, как бы вы изменили этот вложенный список?
Мой разум в правильном месте сравнивает его с кодом, который я опубликовал, или для этого требуется что-то другое?
Ответы
Ответ 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]]
Примечание. Все эти предложения, предложенные в этом ответе, не будут влиять на исходный список. Они будут генерировать новые списки без нежелательных элементов.