从Python中的嵌套列表中删除列

时间:2014-04-02 01:43:14

标签: python list

我需要帮助确定如何解决从嵌套列表中删除“列”以进行修改的问题。

说我有

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

那么,您将如何修改此嵌套列表? 我的思想是否正确地与我发布的代码进行比较,或者这需要不同的东西吗?

7 个答案:

答案 0 :(得分:15)

您只需使用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]]

答案 1 :(得分:6)

如果您要提取该列供以后使用,请将其从原始列表中删除,请使用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's answer

答案 2 :(得分:5)

使用map-lambda

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

答案 3 :(得分:3)

您可以使用为此目的而创建的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]]

你可以在像这样的列表理解中使用它

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

你也可以使用嵌套的List Comprehension,如果索引是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]]

注意:此答案中建议的所有内容都不会影响原始列表。他们将生成没有不需要的元素的新列表。

答案 4 :(得分:2)

这是一种方式,更新以接受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 :(得分:1)

当您执行 del 时,它将删除该索引并重置该索引,因此您必须减少该索引。在这里,我使用计数来减少和重置索引列表中的计数。希望这可以帮助。谢谢

Col.HeaderText = My.Resources.Core.ResourceManager.GetString("DGV_" & Col.Name)

答案 6 :(得分:0)