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
- 过滤器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)
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或类似语言,而不是通用编程语言?它们应该具有您所需的大部分内置功能。