【问题标题】:List all `i` for which `data[i_Integer]` is defined列出所有定义了 `data[i_Integer]` 的 `i`
【发布时间】:2012-08-28 15:35:27
【问题描述】:

我正在读取带有Get[] 的文件,其中包含分号分隔的下标定义序列,如下所示:

data[1] = {stuff};
data[5] = {otherStuff};
data[99] = {yetMoreStuff};

以编程方式确定i 的哪些值是data[i] 定义的最简洁的方法是什么?索引列表会很好,例如{1, 5, 99}.

一个 hacky 方法是遍历可能值的范围以查看哪些值没有头部“数据”(例如Select[data/@Range[1,1000],(Not[MatchQ[#,_data]])?]),但这并不吸引人,因为它不通用(例如它不会'如果我们删除整数下标要求,则找不到data[dog] = "Max";)并假设可以选择一个上限。它也会很慢并且浪费内存。

【问题讨论】:

标签: wolfram-mathematica


【解决方案1】:

我仍然不在我的 Mathematica 机器旁,但我突然想到 DownValues[data] 可能会返回一个规则列表,您可能会很乐意操纵这些规则来摆脱 is。也许是这样的;

Cases[DownValues[data],RuleDelayed[HoldPattern[data[i_Integer]],rhs_]:>i]

【讨论】:

  • 根据你的回答,我的最终表达是Cases[DownValues[data], data[i_] -> i, Infinity]
【解决方案2】:
data[1] = {stuff};
data[5] = {otherStuff};
data[99] = {yetMoreStuff};

Cases[
 DownValues @ data,
 _[_@_@x_Integer, _] :> x
]
{1, 5, 99}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-29
    • 1970-01-01
    • 2020-02-27
    • 2011-12-06
    • 1970-01-01
    • 1970-01-01
    • 2023-02-03
    • 1970-01-01
    相关资源
    最近更新 更多