$\开始组$

这个功能一直困扰着我,我想与大家分享一下。
如果收割非空集sown的结果如下:

res=收获[Sow[a];b;母猪[c];母猪[d];电子]{e,{a,c,d}}

如果没有母猪我们有:

res=收获[e]{e,{}}

我想分配结果列表将设定值转换为新变量,
即使它是空的.
自然的方式

newList=res[[2,1]]

在第二种情况下不起作用,我们有错误:

{}的第1部分不存在

所以我们需要一些条件:

newList=如果[res[[2]]={},res[[2,1]],{}]

有办法让它变得更聪明吗?

更新
感谢所有人的冷静回答,所以我很困惑选择一个

$\端组$
0

7个答案7

重置为默认值
7
$\开始组$

使用的第二个参数弗斯特:

第一个[Reap[a][[2],{}](* {} *)
$\端组$
1
  • $\开始组$ 这仅适用于10.2以后的版本 $\端组$
    – 索莫斯
    评论 5月26日3:38
4
$\开始组$

如果您只想列出已设定的值,那么使用Flatten怎么样?

res=收获[Sow[a];b;母猪[c];母猪[d];e] ;压扁[Last[res]]({a,c,d}*)res=收获[e];压扁[Last[res]](* {} *)
$\端组$
2
  • $\开始组$ 这是我喜欢的代码嗅觉风格,谢谢! $\端组$ 评论 5月25日14:35
  • 2
    $\开始组$ 但是!这是一个陷阱。我需要播种2D点,所以单身压扁工作不正确,我们应该使用压扁[…,1] $\端组$ 评论 5月25日16:44
4
$\开始组$
收获[Sow[a];b;母猪[c];母猪[d];e、 {_},拼接[#2]和][[2,1]]({a,c,d}*)
收割[e,{_},拼接[#2]&][2,1]](* {} *)

原始答案

收获[Sow[a];b;母猪[c];母猪[d];e、 {_},删除[#2,0]&][[2,1]]({a,c,d}*)
收割[e,{_},删除[#2,0]&][[2,1]](* {} *)
$\端组$
1
  • 1
    $\开始组$ 这种方法在某些情况下应该有用,谢谢! $\端组$ 评论 5月25日14:38
4
$\开始组$

我建议您在更新过程中构建收割明确地。以下是几种方法:

1.使用标签和函数清晰地组织结果:

{res,reaped}=收获[Sow[a,“newList”];b;母猪[c,“otherList”];母猪[d,“newList”];e、 _,规则](*{e,{“newList”->{a,d},“otherList”->{c}}*)

现在,您可以通过简单的模式匹配或其他方式提取所需的任何内容。

FilterRules[已获取,“newList”](*{“newList”->{a,d}}*)“newList”/。收获的({a,d}*)查询[“newList”][已获取]({a,d}*)

在没有收获任何东西的情况下,这种方法使您的语义更加清晰。

{res,reaped}=收获[e,_,规则]({e,{}}*)FilterRules[已获取,“newList”](* {} *)“newList”/。收割的(*“新列表”*)查询[“newList”][已获取](*缺少[“PartInvalid”,“newList”]*)

如果规则不适合你的情况,你显然可以想出你想要的任何其他表示法。

2.作为副作用执行任务:

newList={};收割[播种[a];b;母猪[c];母猪[d];e、 _,(新列表=#2)&]({e,{a,c,d}})新列表({a,c,d}*)newList={};收获[e,_,(newList=#2)&]({e,{}}*)新列表(* {} *)
$\端组$
$\开始组$

定义一个辅助函数怎么样?:

清除[fix];修复[{a_,{b_List}}]:={a,b}修复[expr_]:=expr

用法:

{res1,reaped1}=修复@Reap[e] ;资源1(*e*)收割1(* {} *){res2,收割2}=修复@Reap[母猪[a];b;母猪[c];母猪[d];e] ;资源2(*e*)收割2({a,c,d}*)
$\端组$
1
  • $\开始组$ @这是正确的函数代码风格的好例子,谢谢! $\端组$ 评论 5月25日14:33
$\开始组$

类似数据的方法:

res=收获[Sow[a,“X”];b;母猪[c,“X”];母猪[d,“X”];e、 _,规则];newX=查找[最后@res,“X”,{}]({a,c,d}*)res=收割[a;b;c;d;e,_,规则];newX=查找[最后@res,“X”,{}](* {} *)

哦。我刚刚注意到@leric的有一半相似。无论如何,我记得我在这个网站上读到一条建议,总是使用标签播种/收割(和投掷/捕捉)。

$\端组$
$\开始组$

母猪神奇的消失列表元素没有什么作为第一件事收割块:

收割[播种[无];电子]({e,{}}}*)
$\端组$
1
  • $\开始组$ 最后,它可能是最简单的解决方案,无需任何额外假设! $\端组$ 评论 5月28日4:43

你的答案

单击“发布您的答案”,表示您同意我们的服务条款并确认您已阅读我们的隐私政策.

不是你想要的答案吗?浏览标记的其他问题问你自己的问题.