边缘在 Python 中填充列表的两侧



通过在开始重复开始元素和结尾元素将 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 还有其他几个相关问题(例如,这里、这里和这里(,但所有这些问题都只涉及一侧的零填充(或类似(。我特别询问两侧的边缘填充

我认为你的答案很好,我唯一要做的改进是使用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)))

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']

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

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']

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

最新更新