我需要比较两个形式规则列表var -> integer
关于不匹配的事实
确定 lhs 是否存在相同的规则, rhs 的规则相同。
例如:
{a-> 3,b-> 1,c-> 4}〜??? 〜{a-> 3,b-> 1,c-> 4} =真
{a-> 3, b-> 1 ,c-> 4}〜??? 〜{a-> 3, b-> 2 ,c-> 4} = false
{ a-> 3 , b-> 1 ,c-> 4}〜??? 〜{ a-> 1 , b-> 3 ,c-> 4} = false
{a-> 3,b-> 1,c-> 4}〜??? 〜{c-> 4,d-> 8,e-> 9} =真
{a-> 3,b-> 1,c-> 4}〜??? 〜{d-> 8,e-> 9,f-> 7} =真
在我的情况下,它们已经按 lhs 排序,并且所有 lhs 都是唯一的,如果它可以帮助制作尽可能简单的功能。
UPD:忘了一件事!列表可以有不同的长度。但似乎所有三个当前答案仍然有效。答案 0 :(得分:7)
您可以执行类似
的操作check[{a__Rule}, {b__Rule}] :=
Module[{common = Intersection[{a}[[All, 1]], {b}[[All, 1]]]},
SameQ[common /. {a}, common /. {b}]]
然后
check[{a -> 3, b -> 1, c -> 4}, {a -> 3, b -> 1, c -> 4}]
check[{a -> 3, b -> 1, c -> 4}, {a -> 3, b -> 2, c -> 4}]
check[{a -> 3, b -> 1, c -> 4}, {a -> 1, b -> 3, c -> 4}]
产量
True
False
False
答案 1 :(得分:7)
也许更简单
check[a : {__Rule}, b : {__Rule}] := SameQ @@ Transpose[a /. b /. a /. Rule -> List]
修改强>
这是一个更为深奥的版本,它具有完全高级别的优势,因为我们不需要了解规则的内部结构,只知道它们的行为:
checkAlt[a : {__Rule}, b : {__Rule}] := # === (# /. #) &[a /. b /. a]
编辑2
好吧,让我再来一个,只是为了好玩:
check1[{a__Rule}, {b__Rule}] := SameQ @@ ({a, b} /. {{a, b}, {b, a}})
答案 2 :(得分:7)
这是另一种解决方案:
In[12]:= check[a:{__Rule}, b:{__Rule}] := FilterRules[a, b] === FilterRules[b, a]
In[18]:= {{a -> 3, b -> 1, c -> 4}~check ~ {a -> 3, b -> 1, c -> 4} ,
{a -> 3, b -> 1, c -> 4}~check ~ {a -> 3, b -> 2, c -> 4},
{a -> 3, b -> 1, c -> 4}~check ~ {a -> 1, b -> 3, c -> 4},
{a -> 3, b -> 1, c -> 4}~check ~ {c -> 4, d -> 8, e -> 9},
{a -> 3, b -> 1, c -> 4}~check ~ {d -> 8, e -> 9, f -> 7}}
Out[18]= {True, False, False, True, True}
(这取决于选项列表已经排序的事实。)
答案 3 :(得分:2)
这是一个略微概括的方法:
In[24]:= check[lists__] :=
And @@ (SameQ @@@ GatherBy[Join[lists], First])
In[25]:= {
{a -> 3, b -> 1, c -> 4}~check~{a -> 3, b -> 1, c -> 4},
{a -> 3, b -> 1, c -> 4}~check~{a -> 3, b -> 2, c -> 4},
{a -> 3, b -> 1, c -> 4}~check~{a -> 1, b -> 3, c -> 4},
{a -> 3, b -> 1, c -> 4}~check~{c -> 4, d -> 8, e -> 9},
{a -> 3, b -> 1, c -> 4}~check~{d -> 8, e -> 9, f -> 7}
}
Out[25]= {True, False, False, True, True}
这个元素不要求元素是规则,它们可以是列表,或者几乎任何其他元素。它也适用于任何数量的输入。