-4

So I have a list with two numbers which are 1 and 0. Each item in list is equivalent to 1 second of audio. 0 is speech while 1 is music.

Example of the list:

[1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,1,1,1]

I want the output to display the start of audio, end of audio and the type of audio.

Output:

1,6,    music 
7,12,   speech
13,17,  music
18,24,  speech
25,26,  music
27,32,  speech
33,37,  music

2 Answers2

0
a = [1,1,1,1,1,1,0,0,0,0,0,0,1,1,1,1,1,0,0,0,0,0,0,0,1,1,0,0,0,0,0,0,1,1,1,1,1]
changes = [i+1 for i,val in enumerate(a[:-1]) if val != a[i+1]]
lists_start_end = [(1,changes[0])] + [(val+1,changes[i+1]) for i,val in enumerate(changes[:-1])] + [(changes[-1],len(a))]

Out:

[(1, 6), (7, 12), (13, 17), (18, 24), (25, 26), (27, 32), (32, 37)]
Naga kiran
  • 4,528
  • 1
  • 17
  • 31
0
In[2]: data = [1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1]
In[3]: from itertools import groupby
  ...: 
  ...: dex = 1
  ...: result = []
  ...: for k, g in groupby(data):
  ...:     length = sum(1 for _ in g)
  ...:     result.append((
  ...:         (dex, dex + length - 1),
  ...:         'music' if k == 1 else 'speech'
  ...:     ))
  ...:     dex += length
  ...: 
In[4]: result
Out[4]: 
[((1, 6), 'music'),
 ((7, 12), 'speech'),
 ((13, 17), 'music'),
 ((18, 24), 'speech'),
 ((25, 26), 'music'),
 ((27, 32), 'speech'),
 ((33, 37), 'music')]
G_M
  • 3,342
  • 1
  • 9
  • 23