Skip to main content
 首页 » 编程设计

python之使用 for 循环的列表理解

2025年05月04日17softidea

如何使用列表推导式将列表中的前 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]