【问题标题】:How to create a circular list of a given length from a list如何从列表中创建给定长度的循环列表
【发布时间】:2017-07-30 03:32:19
【问题描述】:

我需要一个循环列表。我有 5 个标签的列表:

taglist = ["faint", "shocking", "frosty", "loved", "sadness"]

我有另一个单调递增值的列表:

list = [1,2,3,4,5,6,7]

我想使用taglist 创建另一个列表,长度为list。如果list 有 7 个项目,我想要一个新的标签列表,如下所示。

newtaglist = ["faint", "shocking", "frosty", "loved", "sadness","faint", "shocking"]

这个列表会像循环填充一样继续下去。我该怎么做?

【问题讨论】:

    标签: python list slice itertools circular-list


    【解决方案1】:

    最简单的方法是使用专为此特定目的设计的itertools.cycle

    >>> from itertools import cycle, islice
    >>> baselist = [1,2,3,4,5,6,7]
    >>> taglist = ["faint", "shocking", "frosty", "loved", "sadness"]
    >>> list(islice(cycle(taglist), len(baselist)))
    ['faint', 'shocking', 'frosty', 'loved', 'sadness', 'faint', 'shocking']
    

    另一种方法是将列表相乘(重复)以使其足够大,然后切掉多余的部分:

    >>> baselist = [1,2,3,4,5,6,7]
    >>> taglist = ["faint", "shocking", "frosty", "loved", "sadness"]
    >>> n = len(baselist)
    >>> (taglist * -(n // -len(taglist)))[:n]
    ['faint', 'shocking', 'frosty', 'loved', 'sadness', 'faint', 'shocking']
    

    双重否定用于将地板除法转换为天花板除法,只要有余数,就会向上取整。这样可以确保列表乘法始终至少提供所需数量的元素。

    【讨论】:

    • 使用乘法方法对我来说似乎很好,学习新事物的新方法。
    【解决方案2】:

    newtaglist 可以使用模运算符生成,以确保索引在范围内

    taglist = ["faint", "shocking", "frosty", "loved", "sadness"]
    num_list = [1,2,3,4,5,6,7]
    newtaglist = [taglist[i % len(taglist)] for i in xrange(len(num_list))]
    

    产量:

    ['faint', 'shocking', 'frosty', 'loved', 'sadness', 'faint', 'shocking']
    

    运行它here

    【讨论】:

    【解决方案3】:

    另外,在python中list是内置函数,不要使用list作为变量名。

    taglist = ["faint", "shocking", "frosty", "loved", "sadness"]
    print(len(taglist))
    list_ = [1,2,3,4,5,6,7]
    print(len(list_))
    
    diff = len(list_) - len(taglist)
    
    for i in range(0, diff):
      taglist.append(taglist[i])
    print(taglist)
    

    【讨论】:

    • 虽然不是问题,但如果他想在列表中循环多次,这将失败。我认为在循环之前添加tag_length = len(taglist) 然后taglist.append(taglist[i % tag_length]) 可能会解决这个问题。虽然没有测试。 编辑类似的东西,但我认为这在列表中的方向是错误的......
    【解决方案4】:

    其中 n 是所需的长度:

    [taglist[i % len(taglist)] for i in range(n)]
    

    或者你可以使用雷蒙德的建议

    from itertools import cycle
    infiniteTagList = cycle(taglist)
    [next(infiniteTagList) for i in range(n)]
    

    【讨论】:

      【解决方案5】:

      乘法加切片:

      >>> taglist = ['a', 'b', 'c', 'd', 'e']
      >>> length = 13
      >>> 
      >>> q, r = divmod(length, len(taglist))
      >>> taglist * q + taglist[:r]
      ['a', 'b', 'c', 'd', 'e', 'a', 'b', 'c', 'd', 'e', 'a', 'b', 'c']
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-04-11
        • 2021-06-15
        • 1970-01-01
        • 1970-01-01
        • 2018-07-25
        • 2019-06-19
        • 2018-10-23
        • 2019-02-19
        相关资源
        最近更新 更多