Python 从一个列表跳到另一个列表
我有两张单子Python 从一个列表跳到另一个列表,python,list,Python,List,我有两张单子 a = [1,2,3] b = [] 我想从列表a中移动一个元素,如果它满足某个条件 a = [1,3] b = [2] 下面的代码显示了一个示例,但是,我希望在单个循环中执行此操作。我如何更有效地执行此操作 a = [1,2,3] b = [] pop_list = [] for i in range(len(a)): if a[i] == 2: print("pop:", a[i]) pop_list.append
a = [1,2,3]
b = []
我想从列表a中移动一个元素,如果它满足某个条件
a = [1,3]
b = [2]
下面的代码显示了一个示例,但是,我希望在单个循环中执行此操作。我如何更有效地执行此操作
a = [1,2,3]
b = []
pop_list = []
for i in range(len(a)):
if a[i] == 2:
print("pop:", a[i])
pop_list.append(i)
for i in range(len(pop_list)):
b.append(a.pop(pop_list[i]))
# Reset pop_list
pop_list=[]
理想情况下,我不会生成一个新的列表b。一对列表理解将完成这项工作:一个为
b
选择所需的元素,另一个从a
中删除它们
b = [i for i in a if i == 2]
a = [i for i in a if i != 2]
如果元素
x
存在,您可以将其从b
中删除,并将其附加到a
a = [1, 2, 3]
b = []
x = 2
def remove_append(a, b, x):
if x in a:
a.remove(x)
b.append(x)
remove_append(a, b, x)
print(a)
print(b)
输出:
[1, 3]
[2]
您可以使用
filter
和itertools.filterfalse
并对两者使用相同的过滤功能:
from itertools import filterfalse
a = [1,2,3]
b = []
list(filterfalse(lambda x: x == 2, a))
list(filter (lambda x: x == 2, a))
以下是
itertools.filterfalse
我们必须遍历所有元素,但是,您可以应用此技巧在一个循环中将其添加到适当的列表中:
(附加到循环比删除任意位置的元素更有效)
以下是一种与初始方法类似的单循环方法:
length = len(a)
popped = 0
for i in range(length):
if i == length - popped:
break
if a[i] == 2:
b.append(a.pop(i))
popped += 1
如果我们跟踪从a中弹出的元素数量,我们可以尽早停止循环,因为a中剩下的元素更少。干净的Python方法。谢谢。解决方案运行良好,确实需要我稍微修改您的代码,使之成为
a=list(filterfalse(lambda x:x==2,a))b=list(filter(lambda x:x==2,a))
我看不出与itertools导入filterfalse a=[1,2,3]b=[]list(filterfalse(lambda x:x==2,a))list(filter(lambda x:x==2,a))>>打印(a)[1,2,3]>>>>>打印(b)[]我不知道你想说什么,当我在运行过滤器(至少在python 3.7.7中)后打印a时,它不会更新列表中的值。这些值没有进行适当的修改,而是得到一个副本?索引器:列表索引超出范围a=[2,2]<代码> >代码> A/C>在POP之后变得更短,所以您不能使用旧索引。好点,我只测试了提交的案例,没有考虑这个。谢谢您处理单个元素。“Wups,谢谢您识别我应该添加的一个案例。
a = [1,2,3]
condition_false, condition_true = [], []
for v in a:
# Add to the right list
(condition_false, condition_true)[v == 2].append(v)
# [1, 3]
print(condition_false)
# [2]
print(condition_true)
length = len(a)
popped = 0
for i in range(length):
if i == length - popped:
break
if a[i] == 2:
b.append(a.pop(i))
popped += 1