假设我有一些自定义的Foos集合:
struct Bar {}
struct Foo {
bar: Bar
}
struct SubList {
contents: Vec<Foo>,
}
Run Code Online (Sandbox Code Playgroud)
并假设我也有一个sSuperList的自定义集合SubList:
struct SuperList {
contents: Vec<SubList>,
}
Run Code Online (Sandbox Code Playgroud)
SubList并且SuperList每个都提供一个方法bars:
impl SubList {
fn bars(&self) -> impl Iterator<Item = &Bar> + '_ {
self.contents.iter().map(|x| &x.bar)
}
}
impl SuperList {
fn bars(&self) -> impl Iterator<Item = &Bar> + '_ {
self.contents.iter().flat_map(|x| x.items())
}
}
Run Code Online (Sandbox Code Playgroud)
我想定义一个提供 method 的特征items,并在SubListand上实现该特征,SuperList这样SubList::items就等价于 …
假设我有一个以下形式的表达式。我知道我可以像这样简化表达式:
。但是,
sympy.simplify和sympy.factor都返回原始表达式。
为了解决这个问题,我一直在低级别上操作表达式:
\n\nfactor_map = defaultdict(set)\nadditive_terms = expr.as_coeff_add()[-1]\nfor term1, term2 in combinations(additive_terms, 2):\n common_terms = (\n set(term1.as_coeff_mul()[-1])\n & set(term2.as_coeff_mul()[-1])\n )\n if common_terms:\n common_factor = sympy.Mul(*common_terms)\n factor_map[common_factor] |= {term1, term2}\nRun Code Online (Sandbox Code Playgroud)\n\nfactor_map现在看起来像这样:
{\n a: {a\xe2\x8b\x85x, -a\xe2\x8b\x85y}, \n b: {b\xe2\x8b\x85x, -b\xe2\x8b\x85y}, \n c: {-c\xe2\x8b\x85x, c\xe2\x8b\x85y}, \n x: {a\xe2\x8b\x85x, b\xe2\x8b\x85x, -c\xe2\x8b\x85x}, \n y: {-a\xe2\x8b\x85y, -b\xe2\x8b\x85y, c\xe2\x8b\x85y}\n}\nRun Code Online (Sandbox Code Playgroud)\n\n我按照术语所代表的操作数量对其进行排序:
\n\nfactor_list = sorted(\n factor_map.items(),\n key = lambda i: (i[0].count_ops() + 1) * len(i[1])\n)[::-1]\nRun Code Online (Sandbox Code Playgroud)\n\n然后我重建表达式: …