我的目标是获取未知数量的元素的列表,并将其扩展/切片为确切的n
元素,填充列表太短0
而切片列表太长。
例如
n = 10
foo = [1,2,3,4]
print some_func(foo,n)
应该返回[1,2,3,4,0,0,0,0,0,0]
,并且
n = 10
foo = [1,2,3,4,5,6,7,8,9,10,11,12]
print some_func(foo,n)
应该回来 [1,2,3,4,5,6,7,8,9,10]
现在我正在这样做:
def some_function(l, n):
l.extend([0] * n)
l = l[:n]
return l
但这似乎效率很低。有没有更Python的方式来做到这一点?
编辑:澄清点,我不试图修改原始数组,我返回的新数组可以是浅表副本。
这样做的唯一可能的“更多Python式”方法几乎就是您所拥有的方法,但是跳过了额外的变量分配,只是直接返回结果。您也可以通过使用函数名和变量名符合PEP8,使其绝对更Python化。
除此之外,您可以通过仅添加所需的零来提高效率,而不是构建一个过长的列表然后对其进行修剪。
def pad_or_truncate(some_list, target_len):
return some_list[:target_len] + [0]*(target_len - len(some_list))
分解起来,这里有两种情况(在琐碎的情况下,输入的长度已经正确就可以了)。列表太长或列表太短。
如果列表太长,我们将其切成薄片。some_list[:target_len]
照顾那个。因为切片操作是友好的,所以如果目标长度超出列表的实际长度,则不会中断。
如果列表太短,我们用零填充。我选择通过将列表文字1乘以做到这一点,但是如果您喝的茶更多,则可以使用完全相同的方式使用列表理解2。只需确定要添加的零个数(如果列表不太短则为零,或target_len - len(some_list)
),然后串联由那么多零组成的列表。做完了!
如果您想使其成为就地操作(如您的原始示例似乎正在尝试但未能实现;请参见@chepner的注释),则只需更改return <...>
为some_list[:] = <...>
。
1一些简短的timeit
结果表明,文字乘法比列表理解所隐含的两次迭代要快一些。
2对于后代,列表理解版本应类似于:
return some_list[:target_len] + [0 for _ in range(target_len - len(some_list))]
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句