我有一组对象,我想使用 lambda 表达式或某种条件删除该组的值。
我会这样做:
def pop(container, cond):
value = None
removed = False
for x in container:
if cond(x):
value = x
removed = True
container.remove(x)
break
if not removed:
raise Exception('No value to pop')
return value
一个示例用例是:
compare_object = {"price": 100, "quantity": 1, "product_id": 2}
objs = set([....])
def comparison(obj):
def wrap(obj2):
return (
obj2['price'] == obj['price'] and
obj2['quantity'] == obj['quantity'] and
obj2['product_id'] == obj['product_id']
)
similar_obj = pop(objs, comparison(compare_object))
这样,我们就可以从集合中获取相似的对象,因此在调用该方法后集合将减少。
我想知道是否有一种更简单的方法可以使用 python 中已有的实际数据结构来完成此操作,而不是循环遍历集合,这在大集合上可能会很昂贵?
最佳答案
您可以根据该条件创建一个filter
(对于Python 2为itertools.ifilter
)并删除,而不是使用复杂的for
循环该过滤器中的下一个
元素。
def pop(container, cond):
try:
value = next(filter(cond, container))
container.remove(value)
return value
except StopIteration:
raise Exception("No Value to pop")
示例:
>>> lst = [1,2,3,4,5]
>>> cond = lambda x: x % 2 == 0
>>> pop(lst, cond)
2
>>> pop(lst, cond)
4
>>> pop(lst, cond)
Exception: No Value to pop
>>> lst
[1, 3, 5]
或者您可以通过立即返回找到的值来简化您的函数:
def pop(container, cond):
for x in container:
if cond(x):
container.remove(x)
return x
raise Exception('No value to pop')
关于python - 使用条件从集合中弹出一个值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38514823/