我有两个列表
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。
答案 0 :(得分:5)
一对列表推导即可完成工作:一个为b
选择所需的元素,另一个为a
删除它们
b = [i for i in a if i == 2]
a = [i for i in a if i != 2]
答案 1 :(得分:3)
您可以使用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))
[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中剩余的元素较少。