python - 使用条件从集合中弹出一个值

标签 python collections

我有一组对象,我想使用 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/

相关文章:

python - 原始 SQL 到 SQLAlchemy

python - 需要使用 RegEx 和 BeautifulSoup 查找文本

python - wx.Gauge在Windows中无法更新超过25%,在Linux中有效

java - 集合上的 UnsupportedOperationException

Java 8 - reduce(0, Integer::sum) 和 reduce(0, (a, b) -> a+b) 之间的区别

python - py.test : format failed assert AND print custom message

python - 我在使用 Python 的 Power Set 中陷入递归困境

c# - 堆栈集合在 C# 2.0 中缺少 shift 和 unshift

java - Struts2:单选按钮、迭代和列表问题

ruby-on-rails - rails partials 中的收集计数器