繁体   English   中英

边缘填充Python中列表的两侧

[英]Edge pad both sides of a list in 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']

使用这种方法,如果目标长度减去当前长度是一个奇数,那么它是比起始元素重复一次的结束元素。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM