Python 基于另一个列表的元素在列表中生成重复的元素

Python 基于另一个列表的元素在列表中生成重复的元素,python,list,Python,List,我正在寻找一种方法来实现类似于这个问题中所问的东西,但是是用python实现的 基本上,我有三个相同长度的列表: a = [0.9935,0.1955,1.3165,0.0975,0.2995,-0.0075,1.5015,1.0055,0.4525,0.2235,1.3815,0.4195,1.3685,0.0325,0.0055,0.6175,0.0615,1.8115] b = [4.01,5.207,-0.245,5.312,0.841,1.204,-0.413,4.398,5.309,

我正在寻找一种方法来实现类似于这个问题中所问的东西,但是是用python实现的

基本上,我有三个相同长度的列表:

a = [0.9935,0.1955,1.3165,0.0975,0.2995,-0.0075,1.5015,1.0055,0.4525,0.2235,1.3815,0.4195,1.3685,0.0325,0.0055,0.6175,0.0615,1.8115]
b = [4.01,5.207,-0.245,5.312,0.841,1.204,-0.413,4.398,5.309,1.149, -0.295,1.903,-0.851,1.236,1.39,3.48,-0.034,4.286]
c = [0.221, 0.423, 0.125, 0.228, 0.233, 0.235, 0.244, 0.249, 0.265, 0.265, 0.268, 0.268, 0.275, 0.299, 0.301, 0.316, 0.318, 0.329]
我想根据
c
中存储的浮点数乘以10(四舍五入到最接近的整数),在
a
b
中生成新的重复项。例如,
a
b
中的第一个元素必须重复
2次,因为
c
中的第一个元素是
0.221

int(round(c[0]*10.),0) = 2
因此,新的
a2
b2
列表中的前两个元素如下所示:

a_2 = [0.9935, 0.9935, ...]
b_2 = [4.01, 4.01, ...]
将其应用于
a
b
中的前三项将导致:

a_2 = [0.9935, 0.9935, 0.1955, 0.1955, 0.1955, 0.1955, 1.3165, ...]
b_2 = [4.01, 4.01, 5.207, 5.207, 5.207, 5.207, -0.245, ...]
由于
c[1]=0.423
c[2]=0.125
,这意味着
a
b
中的第二项和第三项需要分别重复
4次和
1次

添加 为了完整起见,我要提到这个问题与另一个问题中给出的答案相关。因此,这是另一个问题答案的组成部分。

您可以使用组合
a
c
,以及
b
c
,并生成新序列:

from itertools import chain

a_2 = list(chain.from_iterable([i] * int(round(j * 10)) for i, j in zip(a, c)))
b_2 = list(chain.from_iterable([i] * int(round(j * 10)) for i, j in zip(b, c)))
演示:

如果
a
b
c
特别大,或者如果对于
c
的某些值,乘以10会导致大量重复,您只需要逐个处理这些值(例如,您不需要在内存中具体化整个
a_2
b_2
列表),您可以在此处使用更多的
itertools
函数:

from itertools import chain, repeat, izip

a_2_generator = chain.from_iterable(repeat(i, int(round(j * 10))) for i, j in izip(a, c))
b_2_generator = chain.from_iterable(repeat(i, int(round(j * 10))) for i, j in izip(b, c))
注意这里缺少
list()
;现在每个阶段都由迭代器处理,每次只生成足够满足一个步骤的内容,从而节省内存


如果您只需要在输出上迭代一次,则可以使用此选项;如果您的绘图库采用常规iterable进行绘图,则这些工具应该可以正常工作。

您可以使用
chain
izip
repeat

from itertools import chain, repeat, izip
new_a = list(chain.from_iterable(repeat(el, int(round(n * 10))) for el, n in izip(a, c)))
from itertools import chain, repeat, izip
new_a = list(chain.from_iterable(repeat(el, int(round(n * 10))) for el, n in izip(a, c)))