gpt4 book ai didi

Python 列表理解- "pop"来自原始列表?

转载 作者:太空狗 更新时间:2023-10-29 21:28:54 24 4
gpt4 key购买 nike

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

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

a = [1, 2, 2, 3, 4, 5]
a, b = my_func(a, *kwargs)

然后我想要:

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]

显然,我更喜欢更优雅、更高效的东西。我想避免遍历列表两次。

编辑:我认为这个问题很独特,因为我不仅仅关心拆分列表——我想修改原始列表。拆分并将其中一个拆分分配给原始列表变量是一种可能的解决方案,但我希望可能有一种方法可以做到这一点而无需明确分配给原始列表变量(类似于 b.append(a.pop( )))

最佳答案

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

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]

更新

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

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]

更新2

我没有意识到我的更新看起来和 user3467349 的几乎一样,但信不信由你,我没有作弊 :-)

关于Python 列表理解- "pop"来自原始列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27907834/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com