删除子列表中位于特定索引的所有元素 - python 2

问题描述 投票:0回答:1

我有一个嵌套的列表,我想删除列表中所有子列表的第二个元素。

列表如下。

A=[[[a, b], [c, d], [g, h]]
   [[e, f], [g, h], [t, f]]]

我想从A中的每个子列表中删除i[1]元素,得到这个结果。

A=[[[a, b],[g, h]]
   [[e, f], [t, f]]]

我试着做 A.remove(A[i][1]) 但它以 "list indices must be integers, not list'错误结束。任何关于如何做到这一点的输入将是一个帮助。

python list
1个回答
2
投票

一个简单的for循环可以解决你的问题。

A=[[['a', 'b'], ['c', 'd'], ['g', 'h']],
   [['e', 'f'], ['g', 'h'], ['t', 'f']]]

for l in A:
    l.pop(1)

# A == [[['a', 'b'], ['g', 'h']],
#       [['e', 'f'], ['t', 'f']]]

0
投票

你可以使用列表理解法 这是 "pythonic "的方式来做这些事情。

A=[[['a', 'b'], ['c', 'd'], ['g', 'h']],
   [['e', 'f'], ['g', 'h'], ['t', 'f']]]

[inner.pop(1) for inner in A]

这相当于 for 循环。Pop在索引处删除一个元素,Python从索引0开始,所以索引1是第二个元素。


0
投票

我认为在一般情况下,突变列表不是最好的选择。你会发现大多数python代码会更喜欢返回一个修改后的列表来代替。比如说

A = [[l[0], *l[2:]] for l in A]

这样做的好处是不会有任何副作用

A = [
    [['a', 'b'], ['c', 'd'], ['g', 'h']],
    [['e', 'f'], ['g', 'h'], ['t', 'f']],
]

B = A
A = [[l[0], *l[2:]] for l in A]

print(B)

仍然会输出原来的列表

[[['a', 'b'], ['c', 'd'], ['g', 'h']], [['e', 'f'], ['g', 'h'], ['t', 'f']]]

而如果你修改了 A:

for l in A:
    l.pop(1)

print(B)

这将会产生。

[[['a', 'b'], ['g', 'h']], [['e', 'f'], ['t', 'f']]]

这并不总是正确的, 但除非你有一个很好的理由, 不要使用突变。


0
投票

我不相信使用 for loops 用于列表操作。您可以使用 maplambda 对所有列表项进行转换。要只保留第一列和第三列,你可以使用

[*map(lambda x: (x[0], x[2]), A)]

或者...

list(map(lambda a, b, c: (a, c), *zip(*A)))

他们都屈服了。

[(['a', 'b'], ['g', 'h']), (['e', 'f'], ['t', 'f'])]
© www.soinside.com 2019 - 2024. All rights reserved.