Mathematica Splitted List со значениями длины - PullRequest
3 голосов
/ 27 января 2012

У меня в Wolfram Mathematica 8.0 есть вложенный список вроде:

             {{1,1,1},{0,0},{1,1,1,1,1},{0},{1,1},{0}}

, и я хотел бы заменить его длинами подстрок следующим образом:

             {{3,3,3},{0,0},{5,5,5,5,5},{0},{2,2},{0}}

Может кто-нибудьПокажите мне быстрый функциональный подход к этой проблеме?

Ответы [ 4 ]

7 голосов
/ 28 января 2012
list = {{1, 1, 1}, {0, 0}, {1, 1, 1, 1, 1}, {0}, {1, 1}, {0}};
Map[Length[#]*# &, list]

Out[193]= {{3, 3, 3}, {0, 0}, {5, 5, 5, 5, 5}, {0}, {2, 2}, {0}}
4 голосов
/ 27 января 2012

Если

list = {{1, 1, 1}, {0, 0}, {1, 1, 1, 1, 1}, {0}, {1, 1}, {0}};

, то

list /. {items : 1 ..} :> ConstantArray[Length[{items}], Length[{items}]]

(замена всех списков, состоящих из одной или нескольких единиц на список соответствующей длины с длиной в качестве значений) дает:

{{3, 3, 3}, {0, 0}, {5, 5, 5, 5, 5}, {0}, {2, 2}, {0}}
2 голосов
/ 28 января 2012

Позвольте

f := # /. (x_List /; Union@x=={1}) :> Table[Length@x, {Length@x}] &

Использовать как

f/@list

Еще лучше (и украсть часть ответа Яна):

f2 := # /. ConstantArray[1, Length@#] :> ConstantArray[Length@#, Length@#] &
1 голос
/ 28 января 2012

Не ясно, какой вариант могут содержать ваши данные.Если все ваши подсписки монотонно равны нулю или единице, тогда метод Дэниела работает.Если вам нужна немного большая скорость, вы можете использовать:

f = Compile[{{s, _Integer, 1}}, If[s[[1]] == 1, s*Length@s, s]];

f /@ list

Если в подсписках могут содержаться другие элементы и / или они могут быть смешанными, то требуется дополнительное тестирование.Я оставлю вам тестирование, которое лучше всего работает с вашими данными:

list /. x : {1 ..} :> (ConstantArray[#, #] &@Length@x)

list /. {x : 1 ..} :> ConstantArray[+x, +x]

list /. x : {1 ..} :> x * Tr@x

Наконец, для всех поклонников "Code Golf":

list /. {x:1..}:>+x{x}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...