【问题标题】:Generate repeated elements in a list based on elements of another list根据另一个列表的元素生成列表中的重复元素
【发布时间】:2013-11-08 21:57:18
【问题描述】:

我正在寻找一种方法来实现类似于这个问题R: repeat elements of a list based on another 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,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(四舍五入到最接近的整数)在 ab 中生成新的重复项。例如,ab 中的第一个元素必须重复 2 次,因为 c 中的第一个元素是 0.221 并且

int(round(c[0]*10.),0) = 2

所以新的a_2b_2 列表中的前两个元素如下所示:

a_2 = [0.9935, 0.9935, ...]
b_2 = [4.01, 4.01, ...]

将此应用于ab 中的前三个项目将导致:

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.423c[2]=0.125 意味着ab 中的第二项和第三项需要分别重复41 次。

添加

为了完整起见,我会提到这个问题与另一个问题How to obtain a weighted gaussian filter 中给出的答案有关。因此,这是使其他问题的答案起作用的一个组成部分。

【问题讨论】:

    标签: python list


    【解决方案1】:

    您可以使用zip() 组合ac,以及bc,与itertools.chain.from_iterable() 一起生成新序列:

    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)))
    

    演示:

    >>> from itertools import chain
    >>> 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]
    >>> list(chain.from_iterable([i] * int(round(j * 10)) for i, j in zip(a, c)))
    [0.9935, 0.9935, 0.1955, 0.1955, 0.1955, 0.1955, 1.3165, 0.0975, 0.0975, 0.2995, 0.2995, -0.0075, -0.0075, 1.5015, 1.5015, 1.0055, 1.0055, 0.4525, 0.4525, 0.4525, 0.2235, 0.2235, 0.2235, 1.3815, 1.3815, 1.3815, 0.4195, 0.4195, 0.4195, 1.3685, 1.3685, 1.3685, 0.0325, 0.0325, 0.0325, 0.0055, 0.0055, 0.0055, 0.6175, 0.6175, 0.6175, 0.0615, 0.0615, 0.0615, 1.8115, 1.8115, 1.8115]
    >>> list(chain.from_iterable([i] * int(round(j * 10)) for i, j in zip(b, c)))
    [4.01, 4.01, 5.207, 5.207, 5.207, 5.207, -0.245, 5.312, 5.312, 0.841, 0.841, 1.204, 1.204, -0.413, -0.413, 4.398, 4.398, 5.309, 5.309, 5.309, 1.149, 1.149, 1.149, -0.295, -0.295, -0.295, 1.903, 1.903, 1.903, -0.851, -0.851, -0.851, 1.236, 1.236, 1.236, 1.39, 1.39, 1.39, 3.48, 3.48, 3.48, -0.034, -0.034, -0.034, 4.286, 4.286, 4.286]
    

    如果abc特别大,或者c的某些值乘以10会导致很多重复,你只需要一个一个处理这些值(例如你不需要在内存中实现整个a_2b_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();现在每个阶段都由迭代器处理,每次只产生足以满足一个步骤的量,从而节省内存。

    如果你只需要迭代输出一次,可以使用它;如果您的绘图库采用通用迭代来绘制这些应该可以正常工作。

    【讨论】:

      【解决方案2】:

      您可以使用chainiziprepeat

      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)))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-10-26
        • 2018-07-14
        • 1970-01-01
        • 1970-01-01
        • 2016-03-21
        • 2021-05-19
        • 2021-03-08
        • 1970-01-01
        相关资源
        最近更新 更多