如何使用列表推导式将列表中的前 n 个奇数加倍?
这是我的解决方案:
>>> n = 2
>>> lst = [1, 2, 3, 4, 5, 6]
>>> lst = [num for num in lst if num % 2 == 1] + [num for num in lst if num % 2 == 0]
>>> lst = [num * 2 for num in lst[:n]] + lst[n:]
>>> print(lst)
[2, 6, 5, 2, 4, 6]
你可以看到我不能再保持 lst 的相同顺序了......
更多例子:
n = 2
lst = [2, 2, 2, 2, 1, 2, 3]
output: lst = [2, 2, 2, 2, 2, 2, 6]
请您参考如下方法:
原始要求*“如果列表中的第一个 n 数字是奇数,则将其加倍”的解决方案:
由于您不想从原始列表中删除任何项目,因此您不能使用列表理解语法的过滤器(for 之后的)。因此,您需要做的只是将要放入目标列表的项目简单地转换。if
对于索引 i 处的元素 x,您的逻辑类似于:
def transform(x, i, n):
if i < n:
if x % 2 == 1:
return x * 2
return x
所以你可以使用那个确切的函数并在你的列表理解中使用它:
>>> n = 2
>>> lst = [1, 2, 3, 4, 5, 6]
>>> [transform(x, i, n) for i, x in enumerate(lst)]
[2, 2, 3, 4, 5, 6]
当然,您也可以将其内联到列表理解中:
>>> [x * 2 if i < n and x % 2 == 1 else x for i, x in enumerate(lst)]
[2, 2, 3, 4, 5, 6]
前n个奇数:
如果你想找到前n个奇数,你不能这样解决。为了解决这个问题,您需要真正记住您之前在遍历列表时遇到了多少个奇数。这意味着你需要有某种“内存”。这样的事情不太适合列表理解,因为列表理解应该一次转换一个项目而不会产生副作用。
因此,您只需以直接的方式执行此操作:
n = 2
lst = [2, 2, 2, 2, 1, 2, 3]
result = []
for x in lst:
if x % 2 == 1 and n > 0:
result.append(x * 2)
n -= 1
else:
result.append(x)
print(result) # [2, 2, 2, 2, 2, 2, 6]
