代码之家  ›  专栏  ›  技术社区  ›  twhale

如何使for循环中的if只运行一次?

  •  3
  • twhale  · 技术社区  · 6 年前

    我试图根据一个条件将两个列表中的项放在一起,以创建第三个列表作为输出。虽然我是新手,但这是相对简单的。然而,我正试图使循环的一部分只运行一次,而这正是我挣扎的地方。有办法吗?

    数据来自文本数据的大数据框。但是我创建了一个简化版的问题,试图更容易地解决它(没有运气):

    a = [1, 2, 3, 4, 5]
    A = [4, 5]
    
    b = []
    for i in a:
        if i in A:
            b.append(3.5) # My aim is to make this line run only once
            b.append(i)
        else:
            b.append(i)
    print(b)
    

    这给出:

    [1, 2, 3, 3.5, 4, 3.5, 5]
    

    我怎样才能得到下面的结果?

    [1, 2, 3, 3.5, 4, 5]
    
    5 回复  |  直到 6 年前
        1
  •  2
  •   Lucas Amos    6 年前

    可以添加一个布尔值,该值初始化为false,然后在运行b.append(3.5)之后直接设置为true。如果在if语句中选中此值,则它将只运行一次。

    a = [1, 2, 3, 4, 5]
    A = [4, 5]
    
    b = []
    
    ran = False
    for i in a:
        if i in A and not ran:
            b.append(3.5) # My aim is to make this line run only once
            ran = True
            b.append(i)
        else:
            b.append(i)
    print(b)
    
        2
  •  4
  •   Dux    6 年前

    可以为此添加布尔标志:

    a = [1, 2, 3, 4, 5]
    A = [4, 5]
    
    b = []
    extend = True
    for i in a:
        if i in A:
            if extend:
                b.append(3.5) # My aim is to make this line run only once
                extend = False
            b.append(i)
        else:
            b.append(i)
    print(b)
    

    编辑 :实际上,如果你的循环 那个 简单地说,其他的答案更优雅,因为除了第一次执行之外, if else 条款是平等的。但是,如果不是,我的代码就是一条路。

        3
  •  2
  •   saraesa    6 年前

    你能用吗? not in ?

    a = [1, 2, 3, 4, 5]
    A = [4, 5]
    
    b = []
    for i in a:
        if i in A and 3.5 not in b:
            b.append(3.5)
            b.append(i)
        else:
            b.append(i)
    print(b)
    
        4
  •  2
  •   Olivier Melançon iacob    6 年前

    更改for循环中逻辑的一般方法是手动声明迭代器,然后可以 break 从循环中继续。

    a = [1, 2, 3, 4, 5]
    A = [4, 5]
    
    b = []
    
    iter_a = iter(a)
    
    for i in iter_a:
        if i in A:
            b.append(3.5)
            b.append(i)
            break
        b.append(i)
    
    b.extend(iter_a)
    
    print(b) # [1, 2, 3, 3.5, 4, 5]
    

    如果条件更复杂,并且遇到这种情况时不再计算代码,这将特别有用。

    使用函数,这可以扩展到任何逻辑。

    def do_something(*args):
        ...
    
    def do_something_once(*args):
        ...
    
    def condition(*args):
        ...
    
    iterator = iter(...)
    
    for i in iterator:
        if condition(i):
            do_something_once(i, ...)
            break
        do_something(i, ...)
    
    for i in iterator:
        do_something(i, ...)
    
        5
  •  1
  •   Taohidul Islam    6 年前

    以上答案都是正确的。但我想再解释一下。在这种情况下,只需在循环内运行命令,最好使用额外的变量来跟踪是否执行。用值初始化变量。在变量值不变之前,我们可以认为该行不会执行。使用这种额外的变量检查不会像使用“in”运算符那样增加程序的时间复杂性。

    我想在这里加一些例子。第一次使用 True False :

    a = [1, 2, 3, 4, 5]
    A = [4, 5]
    
    b = []
    this_portion_is_executed=False
    for i in a:
        if i in A and not this_portion_is_executed:
            b.append(3.5)
            b.append(i)
            this_portion_is_executed=True
        else:
            b.append(i)
    print(b)
    

    使用 integer 价值观:

    a = [1, 2, 3, 4, 5]
    A = [4, 5]
    
    b = []
    this_portion_is_executed=1
    for i in a:
        if i in A and not this_portion_is_executed==1:
            b.append(3.5) 
            b.append(i)
            this_portion_is_executed=2
        else:
            b.append(i)
    print(b)
    

    使用 String :

    a = [1, 2, 3, 4, 5]
    A = [4, 5]
    
    b = []
    this_portion_is_executed="not executed"
    for i in a:
        if i in A and not this_portion_is_executed=="not executed":
            b.append(3.5)
            b.append(i)
            this_portion_is_executed="executed"
        else:
            b.append(i)
    print(b)
    

    使用 list (奇怪的一个,但工作!):

    a = [1, 2, 3, 4, 5]
    A = [4, 5]
    
    b = []
    this_portion_is_executed_list=[]
    for i in a:
        if i in A and not this_portion_is_executed: #because empty list is treated as false
            b.append(3.5) 
            b.append(i)
            this_portion_is_executed.append(3.5) #you can append any other value
        else:
            b.append(i)
    print(b)