【问题标题】:how to change a specifc number of items in a list in python如何在python中更改列表中的特定数量的项目
【发布时间】:2022-01-25 12:58:44
【问题描述】:

我有一个这样的列表:

 my_list=[False, False, True, True, False, False, True]

我想更改此列表,以便前 n 次出现的 True 保持不变,而所有其他的都变为 False。

例如,如果 n=1,我想创建一个与此相同的新列表:

my_new_list=[False, False, True, False, False, False, False]

如果 n=2;应创建此列表:

my_new_list=[False, False, True, True, False, False, False]

我可以轻松地在 for 循环中执行此操作,但在 Python 中执行此操作的最佳方法是什么?

编辑1

这是我的代码:

def f(l,n):
   c=1
   new_l=[False] * len(l)
   if n>= len(l):
       return new_l
   for i,v in enumerate(l):
      if v:
         if(c >= n):
            return new_l
         new_l[i]=True
         c +=1
        
   return new_l

此代码遍历列表中的所有项目,但只是其中的一部分。但是它有 9 行代码,有没有更短的版本或更快的版本?

【问题讨论】:

  • 因为它是一个列表,您必须对其进行一次迭代。你提到你可以。所以你的方式是最好的方式。
  • @shivankgtm for 循环有好几行,能不能短一点?说一行代码

标签: python list


【解决方案1】:
def function(l,n):
new_list = []
c = 0
for i in l:
    if not i:
        new_list.append(False)
    else:
        if c < n:
            new_list.append(False)
            c+=1
        else:
            new_list.append(True)
return new_list

或者:

def function(l,n):
return [False if (not i) or (n := n-1) >= 0 else True for i in l]

【讨论】:

    【解决方案2】:

    使用列表组合:

    my_new_list = [x and (n := n - 1) >= 0 for x in my_list]
    

    Try it online!

    【讨论】:

      【解决方案3】:

      您可以使用累积(来自 itertools)来计算到目前为止您有多少 True 值并将其与 n 的值相匹配:

      my_list=[False, False, True, True, False, False, True]
      
      from itertools import accumulate
      
      n = 1
      r = [isTrue and count<=n for isTrue,count in zip(my_list,accumulate(my_list))]
      print(r)
      [False, False, True, False, False, False, False]
      
      n = 2
      r = [isTrue and count<=n for isTrue,count in zip(my_list,accumulate(my_list))]
      print(r)
      [False, False, True, True, False, False, False]
      

      使用 numpy

      同样的方法可以更简洁地用于 numpy:

      import numpy as np
      
      my_list=[False, False, True, True, False, False, True]
      
      n=1
      r = my_list & (np.cumsum(my_list)<=n)
      print(r)
      # [False False  True False False False False]
      
      n=2
      r = my_list & (np.cumsum(my_list)<=n)
      print(r)
      # [False False  True  True False False False]
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-12
        • 2021-10-19
        • 2022-01-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-07-06
        • 1970-01-01
        相关资源
        最近更新 更多