小编but*_*gon的帖子

在 Rust 中推广迭代方法

假设我有一些自定义的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就等价于 …

traits rust

6
推荐指数
1
解决办法
94
查看次数

在 Sympy 中部分分解表达式

假设我有一个以下形式的表达式第一种形式。我知道我可以像这样简化表达式:第二形式。但是,sympy.simplifysympy.factor都返回原始表达式。

\n\n

为了解决这个问题,我一直在低级别上操作表达式:

\n\n
factor_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}\n
Run Code Online (Sandbox Code Playgroud)\n\n

factor_map现在看起来像这样:

\n\n
{\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}\n
Run Code Online (Sandbox Code Playgroud)\n\n

我按照术语所代表的操作数量对其进行排序:

\n\n
factor_list = sorted(\n    factor_map.items(),\n    key = lambda i: (i[0].count_ops() + 1) * len(i[1])\n)[::-1]\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后我重建表达式: …

python sympy

3
推荐指数
1
解决办法
1001
查看次数

标签 统计

python ×1

rust ×1

sympy ×1

traits ×1