我有一个嵌套的列表,我想删除列表中所有子列表的第二个元素。
列表如下。
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'错误结束。任何关于如何做到这一点的输入将是一个帮助。
一个简单的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']]]
你可以使用列表理解法 这是 "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是第二个元素。
我认为在一般情况下,突变列表不是最好的选择。你会发现大多数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']]]
这并不总是正确的, 但除非你有一个很好的理由, 不要使用突变。
我不相信使用 for loops
用于列表操作。您可以使用 map
和 lambda
对所有列表项进行转换。要只保留第一列和第三列,你可以使用
[*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'])]