Mathematica Pick остановить список, как только я получу 3
Вот что у меня есть...
Select[roll, # <= 3 &]
Теперь в следующем списке может быть один или три три. Я хочу, чтобы он остановился в первых трех слева направо.
Математик пытается закодировать.
Ответы
Ответ 1
Примечание. Я удалил оригинальную публикацию, которая была в основном похожа на запись belisarius. Здесь другая попытка...
Если вы уверены, что номер 3 является членом roll
, тогда это должно работать:
TakeWhile[roll, # != 3 &]~Append~3
Это эквивалентно:
Take[roll, LengthWhile[roll, # != 3 &] +1]
Если вы не можете сделать это предположение, сначала проверьте сначала MemberQ
EDIT. Кредит отправляется TomD для предложения +1 во втором решении, что устраняет необходимость использования Append
.
Ответ 2
Это порядок на порядок быстрее, чем TakeWhile
в списке целых чисел.
list /. {x___, 3, ___} :> {x}
Чтобы получить список через 3, просто используйте {x, 3}
с правой стороны.
Ответ 3
Вы можете попробовать что-то вроде:
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}
*)