Source code for understreck.filter

[docs]def filter(to_filter, filter_to_apply): """Filters a list or tuple Examples: users = [ {"user": "barney", "age": 36, "active": True}, {"user": "fred", "age": 40, "active": False}, ] # Using a lambda function result = _.filter(users, lambda x: not x.get("active")) result == [{"user": "fred", "age": 40, "active": False}] # Using partial dictionary result = _.filter(users, {"age": 36, "active": True}) result == [{"user": "barney", "age": 36, "active": True}] # Using a list with a property name and value result = _.filter(users, ["active", False]) result == [{"user": "fred", "age": 40, "active": False}] # Using a list with a property name. The value must be truthy. result = _.filter(users, ["active"]) result == [{"user": "barney", "age": 36, "active": True}] :param to_filter: the tuple or list to filter :param filter_to_apply: A function or list that defies the filter :return: A filtered list or tuple with the same type as to_filter """ type_to_return = type(to_filter) if hasattr(filter_to_apply, "__call__"): return type_to_return([x for x in to_filter if filter_to_apply(x)]) if isinstance(filter_to_apply, dict): filtered = [] for x in to_filter: matched = 0 keys_in_filter = filter_to_apply.keys() total_to_find = len(keys_in_filter) for key in keys_in_filter: if filter_to_apply[key] == x[key]: matched += 1 if total_to_find == matched: filtered.append(x) return type_to_return(filtered) if isinstance(filter_to_apply, list): if len(filter_to_apply) == 2: property_name = filter_to_apply[0] property_value = filter_to_apply[1] result = [x for x in to_filter if x.get(property_name) == property_value] return type_to_return(result) if len(filter_to_apply) == 1: property_name = filter_to_apply[0] result = [x for x in to_filter if bool(x.get(property_name))] return type_to_return(result)