通过在结尾处的开始和结束元素处重复元素,将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相关的问题(例如here,here和here),但所有这些问题都只涉及零填充(或类似)侧。我特别询问边缘填充双方。
答案 0 :(得分:2)
我认为你的答案很好,我要做的唯一改进是使用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)))
答案 1 :(得分: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']
答案 2 :(得分: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']
使用这种方法,如果目标长度减去当前长度是一个奇数,那么它的结尾元素比start元素重复一次。