这是我所拥有的...
Select[roll, # <= 3 &]
现在,下面的列表可能有一个3或两个3。我希望它停在从左到右的第一个3。
数学家试图编码。
这是我所拥有的...
Select[roll, # <= 3 &]
现在,下面的列表可能有一个3或两个3。我希望它停在从左到右的第一个3。
数学家试图编码。
注意: 我删除了原始帖子,基本上与belisarius的帖子相同。这里再试一次...
如果您确定数字3是roll
的成员,则应该可以这样做:
TakeWhile[roll, # != 3 &]~Append~3
Take[roll, LengthWhile[roll, # != 3 &] +1]
如果您不能做出这个假设,只需使用MemberQ
进行测试。
编辑:感谢TomD建议在第二个解决方案中添加+1,这消除了使用Append
的需要。
Take[roll, LengthWhile[roll, # != 3 &] + 1]
- 681234Append
的需求。我真的很喜欢它。 - DavidC对于整数列表,这比TakeWhile
函数快了一个数量级。
list /. {x___, 3, ___} :> {x}
{x, 3}
。ReplaceList[{1, 2, 3, 4, 3, 5}, {x___, 3, ___} :> {x}]
获取所有匹配项,或者使用 {1, 2, 3, 4, 3, 5} /. {Longest[x___], 3, ___} :> {x}
获取最长匹配项。 - Mr.Wizardf[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
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