Python 将嵌套列表操作转换为列表理解表达式

Python 将嵌套列表操作转换为列表理解表达式,python,python-2.7,list-comprehension,Python,Python 2.7,List Comprehension,我正在使用python2.7.x 我的问题: 我的清单如下: a = [[1,3,2,8],[2,1,4,5],[3,2,4],[4,2,3,5]] 现在对于值为2的所有元素,我希望将它们更改为9,每个子列表的第一个值除外。即: for sublist in a: for i in range(1, len(sublist)): if sublist[i] == 2: sublist[i] = 9 所以现在 a = [[1,3,9,8],[2,

我正在使用
python2.7.x

我的问题:

我的清单如下:

a = [[1,3,2,8],[2,1,4,5],[3,2,4],[4,2,3,5]]
现在对于值为2的所有元素,我希望将它们更改为9,每个子列表的第一个值除外。即:

for sublist in a:
    for i in range(1, len(sublist)):
        if sublist[i] == 2:
            sublist[i] = 9
所以现在

a = [[1,3,9,8],[2,1,4,5],[3,9,4],[4,9,3,5]]
不知何故,我无法将此代码置于列表理解模式。

这应该可以做到:

[[9 if val == 2 and i > 0 else val for i, val in enumerate(sublist)] for sublist in a]
或者,正如@BurhanKhalid在评论中所建议的那样:

[[sublist[0]] + [9 if val == 2 else val for val in sublist[1:]] for sublist in a]
输出:

[[1, 3, 9, 8], [2, 1, 4, 5], [3, 9, 4], [4, 9, 3, 5]]

您可以使用
map
而不是嵌套循环

[[lst[0]]+map(lambda x: 9 if x==2  else x, lst[1:]) for lst in a]

您还可以
[[sublist[0]+[9如果val==2,则为子列表中的val指定值[1:][a]中的子列表指定值]
@BurhanKhalid Cool,您可以将其添加为另一个答案。这只是对您的解决方案的改进,请随意编辑您的答案。您为什么要这样做?您的代码非常好。理解将重新创建整个结构-如果只需替换几个数字,则相当浪费内存。python中的列表理解非常漂亮只有当使用得当时,它才是有用的。没有规则要求每个小循环都要转换成理解。你的代码没有错。
>>> a = [[1,3,2,8],[2,1,4,5],[3,2,4],[4,2,3,5]]
>>> [[j if j!=2 else 9 for j in i] for i in a]
[[1, 3, 9, 8], [9, 1, 4, 5], [3, 9, 4], [4, 9, 3, 5]]