代码之家  ›  专栏  ›  技术社区  ›  mpx

如何在Python中用不同的n次重复list的元素?

  •  0
  • mpx  · 技术社区  · 4 年前

    这样做的目的是用不同的方法重复列表中的元素 n 次数如下。

    ls = [7, 3, 11, 5, 2, 3, 4, 4, 2, 3]
    id_list_fname = ['S11', 'S15', 'S16', 'S17', 'S19', 'S3', 'S4', 'S5', 'S6', 'S9']
    all_ls=[]
    for id,repeat in zip(id_list_fname ,ls):
        res =  [ele for ele in [id] for i in range(repeat)]
        all_ls.append(res)
    

    因此,我希望结果是一个单一的平面列表,我实现了如下。

    def flatten(lst):
        for item in lst:
            if isinstance(item, list):
                yield from flatten(item)
            else:
                yield item
    
    final_output=list(flatten(all_ls))
    

    输出 final_output

    ['S11'、'S11'、'S11'、'S11'、'S11'、'S11'、'S11'、'S15'、'S15', 'S16'、'S16'、'S16'、'S16'、'S16'、'S16'、'S16'、'S16'、'S16'、'S16', 'S16'、'S17'、'S17'、'S17'、'S17'、'S19'、'S19'、'S3'、'S3', ‘S3’、‘S4’、‘S4’、‘S4’、‘S5’、‘S5’、‘S5’、‘S5’、‘S6’、‘S6’, 'S9'、'S9'、'S9']

    但我想知道还有比这更紧凑的方法或技术吗 itertool 使用上面的代码片段实现了repeat元素

    2 回复  |  直到 4 年前
        1
  •  3
  •   mhawke    4 年前

    关于你的代码,使用 list.extend() 而不是 list.append() 将项目添加到 all_ls . 这会将列表中的项目添加到现有列表中,而不是将列表添加到现有列表中。

    ls = [7, 3, 11, 5, 2, 3, 4, 4, 2, 3]
    id_list_fname = ['S11', 'S15', 'S16', 'S17', 'S19', 'S3', 'S4', 'S5', 'S6', 'S9']
    all_ls=[]
    for s,repeat in zip(id_list_fname ,ls):
        res =  [ele for ele in [s] for i in range(repeat)]
        all_ls.extend(res)
    

    输出

    >>> all_ls
    ['S11', 'S11', 'S11', 'S11', 'S11', 'S11', 'S11', 'S15', 'S15', 'S15', 'S16', 'S16', 'S16', 'S16', 'S16', 'S16', 'S16', 'S16', 'S16', 'S16', 'S16', 'S17', 'S17', 'S17', 'S17', 'S17', 'S19', 'S19', 'S3', 'S3', 'S3', 'S4', 'S4', 'S4', 'S4', 'S5', 'S5', 'S5', 'S5', 'S6', 'S6', 'S9', 'S9', 'S9']
    

    更好的方法是使用列表理解-可以用一行来完成:

    >>> [item for n,s in zip(ls, id_list_fname) for item in [s]*n]
    ['S11', 'S11', 'S11', 'S11', 'S11', 'S11', 'S11', 'S15', 'S15', 'S15', 'S16', 'S16', 'S16', 'S16', 'S16', 'S16', 'S16', 'S16', 'S16', 'S16', 'S16', 'S17', 'S17', 'S17', 'S17', 'S17', 'S19', 'S19', 'S3', 'S3', 'S3', 'S4', 'S4', 'S4', 'S4', 'S5', 'S5', 'S5', 'S5', 'S6', 'S6', 'S9', 'S9', 'S9']
    
        2
  •  3
  •   python_user    4 年前

    你可以用 itertools.chain itertools.repeat

    from itertools import chain, repeat
    
    ls = [7, 3, 11, 5, 2, 3, 4, 4, 2, 3]
    id_list_fname = ['S11', 'S15', 'S16', 'S17', 'S19', 'S3', 'S4', 'S5', 'S6', 'S9']
    res = list(chain.from_iterable(repeat(j, times = i) for i, j in zip(ls, id_list_fname)))
    
    print(res)
    

    输出

    ['S11', 'S11', 'S11', 'S11', 'S11', 'S11', 'S11', 'S15', 'S15', 'S15', 'S16', 'S16', 'S16', 'S16', 'S16', 'S16', 'S16', 'S16', 'S16', 'S16', 'S16', 'S17', 'S17', 'S17', 'S17', 'S17', 'S19', 'S19', 'S3', 'S3', 'S3', 'S4', 'S4', 'S4', 'S4', 'S5', 'S5', 'S5', 'S5', 'S6', 'S6', 'S9', 'S9', 'S9']
    
    推荐文章