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