我想仅对每个子列表的第二和第三个元素进行列表理解。我已经能够做到这一点,但我失去了第一个元素。我知道我可以通过for循环很容易地做到这一点,但我想成为pythonic(惯用的python)并使用list comprehension。
test = [[3,6,9],[3,6,9]]
v = [[x/3.0 for x in y[1:3]] for y in test]
print v
[[2.0, 3.0], [2.0, 3.0]]
[[3, 2.0, 3.0], [3, 2.0, 3.0]]
答案 0 :(得分:2)
只需在结果中加入y[:1] +
:
>>> test = [[3,6,9],[3,6,9]]
>>> [y[:1] + [x/3.0 for x in y[1:3]] for y in test]
[[3, 2.0, 3.0], [3, 2.0, 3.0]]
看起来你从根本上误解了理解。他们不会修改原始原位,他们会建立一个新的。这就是为什么,如果你只拿原版的一部分,你只能获得原版的一部分。
如果你想修改某些部分,那么一个循环可能会更好地为你提供服务,并且没有任何关于它的单一声音。
答案 1 :(得分:2)
另一种解决方案是使用三元运算符检查您是否正在处理第一个元素:
v = [[elem/3.0 if idx!=0 else elem for idx, elem in enumerate(k)] for k in test]
此案例将用于列表的所有值,但第一个除外。
答案 2 :(得分:0)
您可以使用以下列表理解
>>> [[i[0]] + [j/i[0] for j in i[1:]] for i in test]
[[3, 2.0, 3.0], [3, 2.0, 3.0]]
注意,如果您希望每个子列表的第一个元素可能为零,则不会阻止被零除。