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

28

我需要帮助解决一个问题,即如何处理移除嵌套列表中的“列”以进行修改。

假设我有:

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

我卡在了如何只删除一列就修改列表上。我之前做过类似的事情吗?除了我们当时是打印它而不是修改它,当然这种情况下它不能工作,因为我相信 break 与我想要保留在列表中的其他值冲突了。

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个回答

25

你可以使用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]]

好的,显然我还有很多要从Python中学习的东西;那么'row'到底是什么?它是Python内置的东西吗?我以前从未使用过它。 - Crisis
1
@危机 这里我们所做的就是遍历列表L。我们将变量(任意命名为)row分配给L的每个元素(即每个嵌套列表)。然后,我们使用del删除row的一个元素。您可能想阅读有关Python基础知识,例如for循环的内容。 - arshajii
@arashajii 哦,好的,好的,我想我明白了。我的教练不想让我们使用 For 循环,所以我不确定。谢谢你。 - Crisis
对我来说是有效的。row 只是行中实际的迭代元素。这就像 C++ 中常见的 i,例如 for (int i =0; i < 10; i++){}。 - negrotico19

11

如果你想从原始列表中删除该列并将其提取供以后使用,可以使用带有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的答案中所示。

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

你也可以使用嵌套的列表推导式,如果索引是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]]

注意:以下建议不会影响原始列表,它们将生成新的列表,不包含不需要的元素。


6

使用 map-lambda

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

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

你可能希望在该表达式的左侧使用L[:]来替换原列表。 - kojiro
@kojiro:非常好的建议。 - Hai Vu

1

2
毫无疑问,这不是一个未受赞赏的仅链接答案或仅代码答案,但您应该明确解释它的工作原理以及为什么它应该有所帮助。拥有投票特权的人更喜欢解释性答案... - Yunnosch

1
当您执行del操作时,它将删除该索引并重置索引,因此您必须减少该索引。在这里,我使用计数来减少并重置我们拥有的索引列表。希望这可以帮助您。谢谢。
nested_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
remove_cols_index = [1,2]

count = 0
for i in remove_cols_index:
    i = i-count
    count = count+1

    del nested_list[i]

print (nested_list)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接