【问题标题】:Edge pad both sides of a list in Python边缘填充Python中列表的两侧
【发布时间】:2018-06-18 22:17:54
【问题描述】:

通过在开始处重复开始元素并在结尾处重复结束元素来将 Python list 填充到特定长度的最佳方法是什么?

例如,我有以下 5 个元素的列表:

['a', 'b', 'c', 'd', 'e']

我想在它的两侧边缘填充,使其具有 10 的新长度,从而产生

# either
['a', 'a', 'a', 'b', 'c', 'd', 'e', 'e', 'e', 'e']

# or 
['a', 'a', 'a', 'a', 'b', 'c', 'd', 'e', 'e', 'e']

(当目标长度减去当前长度是奇数时,如上例所示,我不介意哪个开始和结束元素比另一个重复一次,以便正确地将列表填充到目标长度。)

还有其他几个关于 SO 的相关问题(例如,hereherehere),但所有这些问题都只涉及一侧的零填充(或类似问题)。我特意询问两边的边缘填充

【问题讨论】:

    标签: python list padding


    【解决方案1】:

    这可以使用简单的列表操作来完成:

    my_list = ['a', 'b', 'c', 'd', 'e']
    target_len = 10
    
    diff = target_len - len(my_list)
    left = diff // 2  # explicit integer division
    right = diff - left
    result = left*[my_list[0]] + my_list + right*[my_list[-1]]
    
    print(result)
    

    哪些输出:

    ['a', 'a', 'a', 'b', 'c', 'd', 'e', 'e', 'e', 'e']
    

    使用此方法,如果目标长度减去当前长度为奇数,则结束元素比开始元素重复一次。

    【讨论】:

      【解决方案2】:

      divmod 一次给出两个所需的数字,否则与landogardner ans 相同

      a, n = ['a', 'b', 'c', 'd', 'e'], 10
      
      q, r = divmod(n - len(a), 2)
      
      ap = [a[0]]*q + a + [a[-1]]*(q + r)
      
      ap
      Out[660]: ['a', 'a', 'a', 'b', 'c', 'd', 'e', 'e', 'e', 'e']
      

      【讨论】:

      • 不错的一个...! +1
      【解决方案3】:

      我认为你的回答很好,我唯一的改进是使用itertools 迭代器来提高效率,如果这是一个考虑因素:

      from itertools import chain, repeat
      
      my_list = ['a', 'b', 'c', 'd', 'e']
      final_len = 10
      
      diff = final_len - len(my_list)
      left = diff // 2
      right = diff - left
      result = list(chain(repeat(my_list[0], left), my_list, repeat(my_list[-1], right)))
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-17
        • 2021-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-10-08
        • 2021-07-20
        • 1970-01-01
        相关资源
        最近更新 更多