Python 基于另一个列表的元素在列表中生成重复的元素
我正在寻找一种方法来实现类似于这个问题中所问的东西,但是是用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,
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)))