Pythonic从一个列表弹出到另一个列表

时间:2020-09-16 19:14:37

标签: 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(i)

for i in range(len(pop_list)):
    b.append(a.pop(pop_list[i]))
# Reset pop_list
pop_list=[]

理想情况下,我不会生成新列表b。

5 个答案:

答案 0 :(得分:5)

一对列表推导即可完成工作:一个为b选择所需的元素,另一个为a删除它们

b = [i for i in a if i == 2]
a = [i for i in a if i != 2]

答案 1 :(得分:3)

您可以使用filteritertools.filterfalse并对两者使用相同的过滤功能:

from itertools import filterfalse

a = [1,2,3]
b = []

list(filterfalse(lambda x: x == 2, a))
list(filter     (lambda x: x == 2, a))
[1, 3]
[2]

这里是itertools.filterfalse docs

答案 2 :(得分:1)

如果元素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]

答案 3 :(得分:1)

我们必须遍历所有元素,但是,您可以应用此技巧在一个循环中添加到适当的列表中:

(附加到循环比删除任意位置的元素更有效)


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)

答案 4 :(得分:0)

这是一种类似于您的初始方法的单循环方式:

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中剩余的元素较少。