嵌套列表与列表推导式

1 投票
3 回答
1830 浏览
提问于 2025-04-17 07:48

我刚接触Python,遇到了一些问题,想弄明白怎么在一个嵌套列表的某一部分使用列表推导式(特别是在索引层面)。

比如说,如果我有以下这个列表:

my_list = [[1,2], [3,7], [6,9], [4,3]]

new_list = [[i*2 for i in sublist] for sublist in my_list]

我该怎么修改我的列表推导式,只对每个子列表的索引1进行操作呢?我试了很多方法,但都没有成功。

3 个回答

0

你是说像这样:

my_list = [[1,2], [3,7], [6,9], [4,3]]

new_list = [sublist[0]*2 for sublist in my_list]

Output: 
    new_list == [2, 6, 12, 8]

另外,你忘了在子列表之间加逗号(我在我的回答中修正了这个问题)

我假设你说的“索引1”是指第一个元素。
如果你实际上是指第二个项目(也就是索引1),那么你应该用 sublist[1] 而不是 sublist[0]

1

你是在找这个吗?

>>> my_list = [[1,2], [3,7], [6,9], [4,3]]
>>> [[sublist[0] * 2, sublist[1]] for sublist in my_list]
[[2, 2], [6, 7], [12, 9], [8, 3]]

补充说明:上面的解决方案如果你有很多元素的子列表,就不太好用了。如果是这种情况,可以考虑使用映射的方法:

>>> my_list = [[1,2], [3,7], [6,9], [4,3]]
>>> def double_first(list_):
...     list_[0] *= 2
...     return list_
... 
>>> map(double_first, my_list)
[[2, 2], [6, 7], [12, 9], [8, 3]]

补充说明2:我第一次补充的解决方案可以对子列表进行各种操作,但如果操作比较简单,只是依赖于子列表的索引,那么Dan的解决方案会更快。

希望对你有帮助!

2

这是一个更通用的版本,参考了mac的内容

>>> my_list = [[1,2], [3,7], [6,9], [4,3]]
>>> new_list = [[v*2 if i==0 else v for i,v in enumerate(sublist)] for sublist in my_list]
>>> new_list
[[2, 2], [6, 7], [12, 9], [8, 3]]

撰写回答