我试图根据条件将两个列表中的项目放在一起,以创建第三个列表作为输出。即使我是新手,这也相对简单。但是,我试图让循环的一部分只运行一次,这就是我奋斗的地方。有没有办法做到这一点?
数据来自大型文本数据DataFrame。但是我创建了一个问题的简化版本,试图更容易地解决它(没有运气):
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]
答案 0 :(得分:4)
你可以为此添加一个布尔标志:
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
条款是平等的。但是,如果不是,那么我的代码就是你要去的地方。
答案 1 :(得分:2)
您可以添加一个初始化为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 :(得分:2)
您可以使用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)
答案 3 :(得分:2)
更改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, ...)
答案 4 :(得分:1)
以上所有答案都是正确的。但我想补充一些解释。在这种需要在循环内部运行命令的情况下,最好使用额外的变量来跟踪是否执行。使用值初始化变量。在变量值不变之前,我们可以认为该行未被执行。使用这个额外的变量检查不会增加程序中的时间复杂度,例如使用""操作
我想在这里添加一些例子。第一个使用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
(奇怪的一个,但正在工作!):</ p>
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)
答案 5 :(得分:0)
使用集合而不使用跟踪变量,
a = [1, 2, 3, 4, 5]
A = [4, 5]
listU = [set(a), set(A)]
b = set.union(*listU)
res = []
for i in b:
if 3.5 not in res:
print("loop")
res.append(3.5)
res.append(i)
print(sorted(res))
loop #proof only runs once
[1, 2, 3, 4, 5, 3.5]
[Program finished]