Filter 操作抽象过滤器(列表理解):组合两个过滤器

Filter 操作抽象过滤器(列表理解):组合两个过滤器,filter,lua,set,list-comprehension,Filter,Lua,Set,List Comprehension,短而尖: 给定两个布尔语句,在Lua这样的语言中,计算它们的交点方程最简单的方法是什么 (红色=过滤器1,蓝色=过滤器2,紫色=交叉区域) 长长的哀叹声: 过滤器A:object.ID22) 过滤器A与过滤器B相交。 在维恩图上,它们会重叠。 重叠区域的方程式为: object.Col==“绿色”和(object.ID==64或object.ID>9001) 用Python或Haskell之类的语言如何计算这个等式 我希望最终在Lua中实现这一点,但如果Python、Haskell或其他语

短而尖:
给定两个布尔语句,在Lua这样的语言中,计算它们的交点方程最简单的方法是什么


(红色=过滤器1,蓝色=过滤器2,紫色=交叉区域)

长长的哀叹声:

  • 过滤器A
    object.ID<300

  • 过滤器B
    object.ID<600

过滤器A过滤器B的子集,即:过滤器B将包含与过滤器A匹配的所有内容,以及0个或更多对象。 在维恩图上,过滤器a将位于过滤器B

如何计算相交面积的方程式

一个更复杂的例子:

  • 过滤器X
    object.Col='GREEN'和(object.ID==2或object.ID==64或object.ID>9001)
  • 过滤器Y
    (object.Col='RED'或object.Col='GREEN')和(object.ID==3或object.ID>22)
过滤器A过滤器B相交。 在维恩图上,它们会重叠。 重叠区域的方程式为:
object.Col==“绿色”和(object.ID==64或object.ID>9001)

用Python或Haskell之类的语言如何计算这个等式

我希望最终在Lua中实现这一点,但如果Python、Haskell或其他语言提供了这一功能,我将能够查看源代码并将其转换

以下是我在Lua中表示过滤器的方式:

filter = DataFilter(
    {"and",
        {"or",
            {"==", "Col", "RED"},
            {"==", "Col", "GREEN"},
        },
        {"or",
            {"==", "ID", 3},
            {">" , "ID", 22},
        },
    }
)
function filterX(object)
  return object.Col == 'GREEN' and 
    (object.ID == 2 or object.ID == 64 or object.ID > 9001)
end

function filterY(object)
   return (object.Col == 'RED' or object.Col == 'GREEN') and 
     (object.ID == 3 or object.ID > 22)
end

请给我指出正确的方向。

胡乱猜测:将“过滤器”转换为析取范式,并使用适当的方法(x>5中包含的x==8)进行缩减。

这是您可以实现的。自我注释的代码将帮助您理解该方法

#Create a Class Foo with attributes id and col
class Foo:
    def __init__(this,ID,COL):
        this.id=ID
        this.col=COL



#Dataset
data=["VIOLET","INDIGO","BLUE","GREEN","YELLOW","ORANGE","RED"]
ObjList=[Foo(random.randint(1,70),random.choice(data)) for i in xrange(1,10000)]

#Create the Filter Functions
def FilterX(obj):
    return obj.col == 'GREEN'  and (obj.id == 2 or obj.id == 64 or obj.id > 9001)

def FilterY(obj):
    return (obj.col == 'RED' or obj.col == 'GREEN') and (obj.id == 3  or obj.id > 22)

def FilterZ(obj):
    return obj.col == 'GREEN'  and (obj.id > 50)

#Create a list of filter functions
filters=[FilterX,FilterY,FilterZ]

#Create a set result (that will hold the intersected data) and assign the result of
#applying the First Filter on ObjList
result=set(filter(filters[0],ObjList))

#For the Rest of the filter's apply them on the ObjList, and then intersect
#the resultant set with the result
for s in (set(filter(foo,ObjList)) for foo in filters[1:]):
    result=result.intersection(s)

#Finally Display the result
[(obj.id,obj.col) for obj in result]

我不知道我是否遗漏了一个要点。根据“对象”的性质,您的过滤器似乎只返回一个布尔值。为什么不使用常规的“and”和“and”或“or”和函数来组合它们呢

以下是我在Lua中制作过滤器的方法:

filter = DataFilter(
    {"and",
        {"or",
            {"==", "Col", "RED"},
            {"==", "Col", "GREEN"},
        },
        {"or",
            {"==", "ID", 3},
            {">" , "ID", 22},
        },
    }
)
function filterX(object)
  return object.Col == 'GREEN' and 
    (object.ID == 2 or object.ID == 64 or object.ID > 9001)
end

function filterY(object)
   return (object.Col == 'RED' or object.Col == 'GREEN') and 
     (object.ID == 3 or object.ID > 22)
end
您可以使用以下额外功能定义这些过滤器的“并集”或“交集”:

function union(f,g)
  return function(...)
    return f(...) or g(...)
  end
end

function intersection(f,g)
  return function(...)
    return f(...) and g(...)
  end
end
下面是您的作曲方式:

union(filterX, filterY)(object) -- returns true or false
intersection(filterX, filterY)(object) -- true or false
或者,如果您想经常重复使用它们:

filterXorY = union(filterX, filterY)
filterXandY = intersection(filterX, filterY)

filterXorY(object) -- true or false
filterXandY(object) -- true or false

我希望这能有所帮助。

感谢您提供示例代码。虽然这最终是需要的,但这不是我在问题中所要求的;我需要的是结果集的方程,而不是集合本身。不过,绝对值得投上一票:)谢谢你的提示。我现在正在研究它。我需要得到
filterXandY
的结果表达式,如果没有二进制模块(或string.dump)和一些令人讨厌的黑客攻击,就无法从Lua获得该表达式。而且,它不会被简化。此外,也没有办法确定过滤器X和过滤器Y是相交还是互斥,除非在所有可能的对象中执行某种蛮力循环。我明白了。您是否考虑过使用面向数学的语言,如Mathematica、R或类似语言,而不是通用编程语言?它们应该具有您所需的大部分内置功能。