Group Abstract Group Abstract

Message Boards Message Boards

0
|
9.1K Views
|
15 Replies
|
1 Total Like
View groups...
Share
Share this post:

[?] Count the zeros between the ones in a list?

Posted 7 years ago

I have a list with zero’s separated by ones and I want to count the zero’s between the ones. I tried pure functions but in the wrong way. Can anybody give me a solution? (Needless to say that I am not very experience in Mathematica.)

In[23]:= Test = {1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0};

In[24]:= Test = Flatten[Position[Test, 1]]

Out[24]= {1, 6, 9}

{* The output should be {4, 2} I tried Map[#2 - #1 - 1 &, Test] but it dosn' t.

POSTED BY: Chiel Geeraert
15 Replies

To the collection of possible approaches here comes one more:

data = {0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 1, 1, 0, 0};
ComponentMeasurements[Image[1 - {data}], "Count"]
POSTED BY: Henrik Schachner
Posted 7 years ago
POSTED BY: Chiel Geeraert
Posted 7 years ago

Really a nice solution. I learned quite a few things from all reactions.

Best regards, Chiel Geeraert (Netherlands)

POSTED BY: Chiel Geeraert
Posted 7 years ago

A slight variation:

Differences@Flatten@Position[Test, 1] - 1
POSTED BY: Hans Milton
POSTED BY: Raspi Rascal
Posted 7 years ago
POSTED BY: Chiel Geeraert
Posted 7 years ago

Here is my workaround :

In[20]:= Test = {1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 0, 1, 0, 0, 0,
    0, 0, 0, 0, 1, 0, 0};
(* The desired output is the number of zero's between the ones so
{4,2,5,7} *)

In[15]:= Test = Flatten[Position[Test, 1]]

Out[15]= {1, 6, 9, 15, 23}

In[17]:= Result = 
 Table[Test[[k + 1]] - Test[[k]] - 1, {k, 1, Length[Test] - 1}]

Out[17]= {4, 2, 5, 7}
POSTED BY: Chiel Geeraert

We would like to see your workaround solution.

POSTED BY: Raspi Rascal
Posted 7 years ago

Thank you very much. In the meantime I have found a simple , not very sophisticated, workaround solution but it works.

I will try your suggestion and try to understand it.

Best regards, Chiel Geeraert

POSTED BY: Chiel Geeraert
Posted 7 years ago

Thank you very much. In the meantime I have found a simple , not very sophisticated, workaround solution but it works.

I will try your suggestion and try to understand it.

Met vriendelijke groet, Chiel Geeraert

POSTED BY: Chiel Geeraert
Posted 7 years ago
POSTED BY: Chiel Geeraert
SequenceCases[{1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0}, x : {1,0 ..,1} :> Length[x]-2,Overlaps->True]
POSTED BY: Raspi Rascal

Can be done even shorter:

SequenceCases[{1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0}, x : {0 ..} :> Length[x]]
POSTED BY: Sander Huisman
t=FromDigits[Test]//IntegerString;
StringCases[t,x:("1"~~"0"..~~"1"):>StringLength[x]-2,Overlaps->True]

Maybe faster for large list?

POSTED BY: Raspi Rascal

You may try SequenceSplit:

l = {1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0};
SequenceSplit[l, {1 ..}]
Map[Length, %]

This counts also the trailing three zeros. You can correct that problem if you really need it.

POSTED BY: Gianluca Gorni
Reply to this discussion
Community posts can be styled and formatted using the Markdown syntax.
Reply Preview
Attachments
Remove
or Discard