通过分组从python中的列表列表创建新列表
这个问题与我的另一个问题有关: 如果通过分组从python中的列表列表创建新列表,python,Python,这个问题与我的另一个问题有关: 如果q=[[0.0,4.0],[10.0,12.0],[15.0,20.0],[21.0,28.0],[32.0,36.0],[41.0,44.0]。 新列表q'应该是[4.0,10.0],[12.0,15.0],[20.0,21.0],[28.0,32.0],[36.0,41.0] 我所做的是: import numpy q= [[0.0,4.0], [10.0,12.0], [15.0,20.0], [21.0,28.0], [32.0,36.0],[41.0
q=[[0.0,4.0],[10.0,12.0],[15.0,20.0],[21.0,28.0],[32.0,36.0],[41.0,44.0]。
新列表q'应该是[4.0,10.0],[12.0,15.0],[20.0,21.0],[28.0,32.0],[36.0,41.0]
我所做的是:
import numpy
q= [[0.0,4.0], [10.0,12.0], [15.0,20.0], [21.0,28.0], [32.0,36.0],[41.0,44.0]]
x= []
print "in between"
for t in range(len(q)-1):
a,b=q[t][1],q[t+1][0]
x.append([a,b])
for i in x:
print i
输出:
[4.0, 10.0]
[12.0, 15.0]
[20.0, 21.0]
[28.0, 32.0]
[36.0, 41.0]
更新:我想在^output中再添加两个段
上下文:这些片段是时间戳
假设片段不是从零开始,而是从3.0开始
q=[[3.0,4.0]、[10.0,12.0]、[15.0,20.0]、[21.0,28.0]、[32.0,36.0]、[41.0,44.0]。
文件以50.0结尾
在我的原始输出中,我想添加区域:[0.0,3]
和[44.0,50.0]
,这样我也可以使这些区域静音
为此,我只是:
import numpy
speaker_segments= [[3.0,4.0], [10.0,12.0], [15.0,20.0], [21.0,28.0], [32.0,36.0],[41.0,44.0]]
segments_to_silence = []
starting= 0.0
end= 50.0
# simple output
for t in range(len(speaker_segments)-1):
a, b = speaker_segments[t][1],speaker_segments[t+1][0]
segments_to_silence.append([a, b])
val = len(speaker_segments)
y= speaker_segments[val-1][1]
# appending end of segment item and end of file item to output i.e [44.0,50.0].
if end >y:
a,b =y,end
segments_to_silence.append([a,b])
print "appending end regions"
print segments_to_silence
# appending the starting portions 0.0 - 3.0 :
f=speaker_segments[0][0]
if starting < f:
a=starting
b=f
segments_to_silence.append([a,b])
print "appending beginning regions"
print segments_to_silence
是否可以将附加的[0.0,3.0]移到开头?这样它们就在一个有序的列表中,并按照合唱顺序排列
更新2:
我只需要对if条件进行重新排序,使[0.0,x.x]首先进入,然后进入中间,最后进入文件[50.0]的结尾
谢谢大家的快速回复!:) 使用,您可以执行以下操作:
x = [[a[1], b[0]] for a, b in zip(q, q[1:])]
在使用python 2时,最好使用迭代器版本的zip
:
编辑:正如让·弗朗索瓦在评论中指出的那样:
from itertools import islice, izip
x = [[a[1], b[0]] for a, b in izip(q, islice(q, 1, None))]
您可以展平、放弃第一个,然后重新组合:
>>> q = [[0.0,4.0], [10.0,12.0], [15.0,20.0], [21.0,28.0], [32.0,36.0],[41.0,44.0]]
>>> from itertools import chain, islice
>>> list(map(list, zip(*2*(islice(chain(*q), 1, None),))))
[[4.0, 10.0], [12.0, 15.0], [20.0, 21.0], [28.0, 32.0], [36.0, 41.0]]
Python 2版本:
>>> from itertools import chain, islice, izip
>>> map(list, izip(*2*(islice(chain(*q), 1, None),)))
您还可以使用
itertools.groupby
:
q= [[0.0,4.0], [10.0,12.0], [15.0,20.0], [21.0,28.0], [32.0,36.0],[41.0,44.0]]
new_q = list(itertools.chain.from_iterable(q))
n = [(a, list(b)) for a, b in itertools.groupby(sorted(new_q, key=lambda x:any(a == x for a, b in q)), key=lambda x:any(a == x for a, b in q))]
final_data = [[a, b] for a, b in zip(dict(n)[0], dict(n)[1][1:])]
输出:
[[4.0, 10.0], [12.0, 15.0], [20.0, 21.0], [28.0, 32.0], [36.0, 41.0]]
如何更好?比如说,效率更高?还是更干净的代码?抱歉没有澄清。如果有更有效的方法。我正在将这些最终输出传递给padding和trimming函数,以消除我传递的任何内容。而
slice
的迭代器版本在执行时,用于q[1:]
,避免了所有临时列表创建。这只是减少了行数,但并没有减少代码,而且绝对不容易理解。。。。
q= [[0.0,4.0], [10.0,12.0], [15.0,20.0], [21.0,28.0], [32.0,36.0],[41.0,44.0]]
new_q = list(itertools.chain.from_iterable(q))
n = [(a, list(b)) for a, b in itertools.groupby(sorted(new_q, key=lambda x:any(a == x for a, b in q)), key=lambda x:any(a == x for a, b in q))]
final_data = [[a, b] for a, b in zip(dict(n)[0], dict(n)[1][1:])]
[[4.0, 10.0], [12.0, 15.0], [20.0, 21.0], [28.0, 32.0], [36.0, 41.0]]