python:找出一个对象数组是否符合某些标准

2024-06-09 22:45:40 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个物品清单

[{'type' :'car', 'color' : 'red', 'engine' : 'diesel'}, {'type' : 'truck'...}

现在我正在寻找基于python3的方法,它允许我定义返回true或false的过滤器。 在那个阵列里有一辆红色卡车和一辆装有柴油发动机的汽车吗? 有人知道从哪里开始找吗?你知道吗

基本上,我想创建一个服务,允许您将规则与这些列表相匹配。就像用户可以定义一些过滤器,我应用于返回true或false的列表。你知道吗

比如“颜色=红色,引擎=柴油机”…就像你在prolog中可以做的那样。我看着派克,但看起来太复杂了


Tags: falsetrue过滤器列表定义typered物品
3条回答

您可以构建一个列表,只选择符合预期条件的元素:

my_objects = [{'type' :'car', 'color' : 'red', 'engine' : 'diesel'}]

print([x for x in my_objects if x['type'] == 'car' and x['color'] == 'red'])

给出:

>>> inv=[{'type' :'car', 'color' : 'red', 'engine' : 'diesel'}, {'type' : 'truck','color':'red','engine':'diesel'}, {'type':'bike','color':'red','engine':None}]

由于您有一个字典列表,请构造一个包含要筛选的内容的dict:

>>> fo={'color':'red', 'type':'car'}

然后用all过滤元素之间的and,或者用any过滤元素之间的or

>>> [d for d in inv if all(d[e]==fo[e] for e in fo if e in d)] 
[{'color': 'red', 'engine': 'diesel', 'type': 'car'}]

如果您更喜欢filter函数,请使用相同的方法:

>>> fo={'engine': 'diesel'}
>>> filter(lambda d: all(d[e]==fo[e] for e in fo if e in d), inv)
[{'color': 'red', 'engine': 'diesel', 'type': 'car'}, {'color': 'red', 'engine': 'diesel', 'type': 'truck'}]

只需使用for-loop创建一个function

def check(lst, vehicle, val):
    for d in lst:
        if d["type"] == vehicle:
            return val in d.values()
    return False

我们可以做一些测试:

>>> check([{'type' :'car', 'color' : 'red', 'engine' : 'diesel'}], "car", "red")
True
>>> check([{'type' :'car', 'color' : 'red', 'engine' : 'diesel'}], "car", "blue")
False
>>> check([{'type' :'car', 'color' : 'red', 'engine' : 'diesel'}], "car", "diesel")
True

相关问题 更多 >