Mathematica Pick остановить список, как только я получу 3 - PullRequest
5 голосов
/ 02 апреля 2011

Вот что у меня есть ...

Select[roll, # <= 3 &]

Теперь в следующем списке могут быть три или два три.Я хочу, чтобы он остановился на первых трех слева направо.

Математик пытается кодировать.

Ответы [ 3 ]

7 голосов
/ 02 апреля 2011

Примечание : я удалил свое первоначальное сообщение, которое в основном было похоже на сообщение Велисария.Вот еще одна попытка ...

Если вы уверены, что число 3 является членом roll, тогда это должно работать:

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

Это эквивалентно:

Take[roll, LengthWhile[roll, # != 3 &] +1]

Если вы не можете сделать это предположение, просто протестируйте сначала с помощью MemberQ

EDIT : Кредит переходит к TomD за предложение +1 во втором решении, что исключаетнужно использовать Append.

6 голосов
/ 02 апреля 2011

Это на порядок быстрее, чем TakeWhile в списке целых чисел.

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

Чтобы получить список от до 3, просто используйте {x, 3} справасторона стороны.

1 голос
/ 02 апреля 2011

Вы можете попробовать что-то вроде:

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}
*)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...