【问题标题】:How to populate (append) list in Python with elements, that appear multiple of 2 times如何在 Python 中使用出现 2 倍的元素填充(附加)列表
【发布时间】:2021-01-07 00:29:13
【问题描述】:

假设我在 Python 中有一个包含 2 个元素 [[1 , 2], ...] 的列表。现在我需要得到这样的东西:

[2, 2] [2, 3] [3, 4] [3, 5] [3, 6] [3, 7]

第二个元素总是上升 1,第一个元素也是,但在上升之前出现 2^n (n>=1) 次。

接下来将是 8 个列表,第一个元素为 4,出现 8 次,列表的第二个元素将从 8 上升到 15。

【问题讨论】:

  • 您是否正在尝试修改一个现有的列表,该列表可以很长并且其中包含任何数字,根据您指定的模式添加起始值,而不是延长总列表?或者您是否尝试将上述列表模式的构造扩展为任意指定长度?
  • 我有一些列表,现在尝试添加具有指定模式的值。我认为你的第二个陈述更适合这里。
  • 每个添加是否只对列表的最后一个元素进行操作?因此,如果您的起始列表有 5 个子列表,算法应该忽略前四个元素并仅基于最后一个元素扩展模式?
  • 没错,算法应该寻找列表中最后一个存在的元素,并根据其中的值应用模式。 [2,4] 列表中的最后一个元素。然后接下来是 [3,5] [3,6]... [4,7][4,8][4,9][4,10]...

标签: python list append


【解决方案1】:

也许您可以尝试如下嵌套的for 循环

def fn(n, x):
    for i in range(2, n+1):
        for j in range(2**(i-1), 2**i):
            x.append([i, j])
    return(x)

from math import log2,ceil
def fn(n,x): 
    [x.append([ceil(log2(i)),i-1]) for i in range(3,2**n+1)]
    return(x)

这样

>>> fn(3, [[1,2]])
[[1, 2], [2, 2], [2, 3], [3, 4], [3, 5], [3, 6], [3, 7]]

>>> fn(4, [[1,2]])
[[1, 2], [2, 2], [2, 3], [3, 4], [3, 5], [3, 6], [3, 7], [4, 8], [4, 9], [4, 10], [4, 11], [4, 12], [4, 13], [4, 14], [4, 15]]

【讨论】:

    【解决方案2】:
    from math import log
    initial_list = [[1,2]]
    def extend_pattern(initial_list,n):
        last_sublist = initial_list[-1]
        first_element = last_sublist[0]
        for i in range(n):
            last_sublist = list(last_sublist)
            if i != 0:
                last_sublist[1] += 1
            last_sublist[0] = first_element + int(log(i+2,2))
            initial_list.append(last_sublist)
    extend_pattern(initial_list,10)
    print(initial_list)       
    #[[1, 2], [2, 2], [2, 3], [3, 4], [3, 5], [3, 6], [3, 7], [4, 8], [4, 9], [4, 10], [4, 11]]
        
    

    【讨论】:

      【解决方案3】:

      听起来很有趣。

      如果您想要一个输出如下的函数:
      [[1, 1], [2, 2], [2, 3], [3, 4], [3, 5], [3, 6], [3, 7], [4, 8], [ 4, 9], [4, 10]]

      然后这个

      def populate(n):
          left=1
          right=1
          temp=right*2
          output=[]
          for i in range(0,n):
              output.append([left,right])
              right+=1
              if(right==temp):
                  left+=1
                  temp=right*2
          return output
      

      是其中一种方法。

      如果你的意思是从一个列表开始,并且 n 这样的东西应该可以工作:

      def populate(inputlist,n):
          left=inputlist[len(inputlist)-1][0]+1
          right=inputlist[len(inputlist)-1][1]+1
          temp=right*2
          for i in range(0,n):
              inputlist.append([left,right])
              right+=1
              if(right==temp):
                  left+=1
                  temp=right*2
          return inputlist 
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-01-19
        • 2019-11-24
        • 2022-12-04
        • 2013-09-08
        相关资源
        最近更新 更多