Python列表理解 - 原始列表中的"pop"结果?

Tay*_*nes 8 python list-comprehension

假设我在Python 3.X中有一个列表.我使用list comprehension返回该列表的一个子集---是否有一种简单/ Pythonic的方式从原始列表中"弹出"该子集(因此返回后该子集中的元素不再在原始列表中) ?谢谢!

示例(我需要帮助定义my_func):

a = [1, 2, 2, 3, 4, 5]
a, b = my_func(a, *kwargs)
Run Code Online (Sandbox Code Playgroud)

我想要:

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

注意:我不希望一次关闭一个值,而是一次性整个子集."流行"可能不是最好的术语,但我不知道是什么.

我能想到的最好的方法是:

 temp = [idx for idx, val in enumerate(a) if val > 2]  
 b = [a[i] for i in temp]  
 a = [val for idx,val in enumerate(a) if idx not in temp]  
Run Code Online (Sandbox Code Playgroud)

显然,我更喜欢更优雅和高效的东西.我想避免两次超过列表.

编辑:我认为这个问题是独一无二的,因为我不仅仅关心拆分列表 - 我想修改原始列表.拆分并将其中一个拆分分配给原始列表变量是一种可能的解决方案,但我希望可能有一种方法可以在不明确分配给原始列表变量的情况下执行此操作(类似于b.append(a.pop(类似)) )))

Hai*_* Vu 5

只需使用列表理解过滤掉不需要的项目:

a = [1, 2, 2, 3, 4, 5]
condition = lambda x: x > 2
b = [x for x in a if condition(x)]      # b == [3, 4, 5] 
a = [x for x in a if not condition(x)]  # a == [1, 2, 2]
Run Code Online (Sandbox Code Playgroud)

更新资料

如果您担心效率,那么这是另一种只扫描列表一次的方法:

def classify(iterable, condition):
    """ Returns a list that matches the condition and a list that
    does not """
    true_list = []
    false_list = []
    for item in iterable:
        if condition(item):
            true_list.append(item)
        else:
            false_list.append(item)
    return true_list, false_list

a = [1, 2, 2, 3, 4, 5]
b, a = classify(a, lambda x: x > 2)
print(a)  # [1, 2, 2]
print(b)  # [3, 4, 5]
Run Code Online (Sandbox Code Playgroud)

更新2

我没有意识到我的更新看起来与user3467349的更新几乎相同,但是无论您是否相信,我都没有作弊:-)