Mathematica选择函数:如何在列表中找到第一个3并停止?

5

这是我所拥有的...


Select[roll, # <= 3 &]

现在,下面的列表可能有一个3或两个3。我希望它停在从左到右的第一个3。

数学家试图编码。


1
你能澄清一下吗?f[{1, 2, 5, 2, 3, 1, 2, 3}]应该返回什么?{1,2,5,2}{1,2,2}{1,2,5,2,3}还是{1,2,2,3} - Brett Champion
它提供了一个随机数列表。我想显示前三个数字的列表。 - Corshot
3个回答

7

注意: 我删除了原始帖子,基本上与belisarius的帖子相同。这里再试一次...

如果您确定数字3是roll的成员,则应该可以这样做:

TakeWhile[roll, # != 3 &]~Append~3

这相当于:
Take[roll, LengthWhile[roll, # != 3 &] +1]

如果您不能做出这个假设,只需使用MemberQ进行测试。

编辑:感谢TomD建议在第二个解决方案中添加+1,这消除了使用Append的需要。


1
我从这个答案中学到了很多。这是方法二的一个非常微小的变体吗?Take[roll, LengthWhile[roll, # != 3 &] + 1] - 681234
@TomD,你的变量很好地消除了对Append的需求。我真的很喜欢它。 - DavidC

6

对于整数列表,这比TakeWhile函数快了一个数量级。

list /. {x___, 3, ___} :> {x}

要获取列表中的第三个元素,只需在右侧使用{x, 3}

你的解决方案似乎有效。(尽管我认为它应该在x后包括3)。但无论如何,为什么Mma不允许数字3成为x序列的一部分呢?也就是说,它是如何知道你想要第一个3的呢? - DavidC
2
@David 它只是给出第一个匹配项,而默认方法是在第一个模式上最短的。你可以使用 ReplaceList[{1, 2, 3, 4, 3, 5}, {x___, 3, ___} :> {x}] 获取所有匹配项,或者使用 {1, 2, 3, 4, 3, 5} /. {Longest[x___], 3, ___} :> {x} 获取最长匹配项。 - Mr.Wizard

1
你可以尝试这样做:
f[list_, item_] := list[[1 ;; Position[list, item][[1, 1]]]]  

使用方法:

f[{1, 2, 3, 4, 1, 4, 3, 4, 3, 5, 6, 7, 3, 2}, 3]
(*
->{1,2,3}
*)
f[{1, 2, 3, 4, 1, 4, 3, 4, 3, 5, 6, 7, 3, 2}, 5]
(*
->{1,2,3,4,1,4,3,4,3,5}
*)

如果你也想过滤大于3的值,你可以使用你的代码包装我的代码:

g[list_, item_] :=  Select[list[[1 ;; Position[list, item][[1, 1]]]], # <= 3 &]  

所以:

g[{-1, 1, 2, 5, 7, 1, 3, 4, 1, 4, 3, 4, 3, 5, 6, 7, 3, 2}, 3]
(*
->{-1,1,2,1,3}
*)

当你的解决方案仍然显示为:f[list_, toSearch_, times_] := If[Length@# < times, list, list[[1 ;; #[[times, 1]]]]] &@ Position[list, toSearch]时,我已经发布了我的解决方案。 - DavidC
@David 没问题,我一开始误解了问题。 - Dr. belisarius

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接