【问题标题】:Julia: Evaluate expressions from a dictionaryJulia:评估字典中的表达式
【发布时间】:2016-05-21 08:17:33
【问题描述】:

我有一个表达式列表,f.x

"a1 || a4"
"a3 && a5

还有一本包含这些真值的字典

a1 -> true
a2 -> false

我需要使用字典中的真/假值评估列表中的表达式

任何想法如何轻松实现?非常感谢任何帮助

【问题讨论】:

  • 性能重要吗?表达式列表是否固定?是否使用不同的输入值集对它们进行评估?它们只是布尔值吗?如果表达式被重用,那么您可能希望解析一次并存储 Expr,而不是每次都解析它们。

标签: julia


【解决方案1】:

我觉得可能有一个更优雅的解决方案,但这肯定会完成工作。

truths = Dict("a1" => true, "a2" => false)
expressions = ["a1 || a4", "a1 && a2"]

for (key, value) in truths
    info("evaluating: '$key = $value'")
    eval(parse("$key = $value"))
end

for exp in expressions
    info("$exp => $(eval(parse(exp)))")
end

【讨论】:

    【解决方案2】:

    f.x 是什么?你说的列表是什么意思?以后请给出工作代码,而不是这样的sn-ps代码。

    在 Julia 中,您几乎肯定不想将像 a1 || a4 这样的 Julia 代码存储在字符串中,而是作为 Julia 表达式(这是字符串的 parse 实际给出的):

    ex = [:(a1 || a4), :(a3 && a5)]
    

    其次,您可能不想使用具有这样名称的变量,而是使用数组:

    a = bitrand(5)   # 5 random bits
    a[1]   # gives true
    

    然后你会使用

    ex = [:(a[1] || a[4]), :(a[3] && [a[5])]
    

    你可以这样做

    map(eval, ex)
    

    计算向量中的每个表达式。

    如果您认为使用a[1] 而不是a1 输入过多,您可以遍历语法树并将a_i 替换为a[i]。或者,如果您有字符串,只需在字符串上使用 replace 函数:

    replace("hello a3 a34", "a3", "a[3]")
    

    (所以要小心!)

    【讨论】:

    • 对不起,我试图尽可能一般地输入它。 srting 表达式从 JSON 文件中读入一个类型,代表被剔除的基因(如果您了解您的生物学),整个列表需要经常评估
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-01-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-24
    相关资源
    最近更新 更多