我有这样一个列表(为了简单起见,我使用整数累进数,但它们实际上是浮动汇率):
List = [4,5,6,7,8,9,10,11,12] #__len__ = 9
我需要“延迟”(偏移)这个列表off=3(但是这个数字3可能是可变的),方法是为第一个“off”值加上“0”,然后从“off+1”开始,值在列表的“0”位置:
OffsetList = [0,0,0,4,5,6,7,8,9] #__len__ = 9
我已经考虑过这两种可能的解决方案,但我对编程非常陌生,我想从某人那里得到一个意见,即什么是最优化的解决方案,以及是否有可能开发出一种不同的解决方案,它可能比我想的更好:
#SOLUTION 1
OffsetList = []
for _ in range(0,off):
OffsetList.append(0)
for k in range(0, len(List) - off):
OffsetList.append(List[k])
#SOLUTION 2
OffsetList = []
for _ in range(0,off):
OffsetList.append(0)
j = 0
while len(OffsetList) < len(List):
OffsetList.append(List[j])
j += 1
你认为哪一个更优化(快速、安全、稳定等),为什么?另外(我肯定),有没有比我想的两个更好的解决方案?你知道吗
最好不要在添加0时显式地遍历列表
Sidenote:我正在使用iPython
%timeit
魔术,它使用Python的内置timeit
module。您也可以直接调用time-it模块python -m timeit --setup 'n=50;l=[1,2,3,4,5]' 'l = [0] * n + l'
,但是使用iPython会让事情变得更简单。你知道吗一般来说,Python中的显式循环比列表理解慢,但这并不适用于所有内容,也不意味着您应该尝试将所有内容作为列表理解编写。见this article。我不明白为什么要使用while循环,当你清楚你想要什么时,在列表的开头添加
n
元素。在这种情况下,我更喜欢这样的代码:l = [0] * offset + l
它的意图非常清楚。你知道吗来自
JoelCornett
的评论注意
prefix5
是以纳秒为单位测量的,其他的是微秒。你知道吗prefix3
和prefix4 & prefix5
之间的区别在于itertools.chain
返回一个迭代器(没有随机访问,不能对其调用len
)。因此,将其放入prefix3
中的一个列表需要开销。如果您只对迭代元素感兴趣,而不是通过索引访问特定的元素,那么应该使用prefix5
,否则使用prefix2
或prefix3
。你知道吗可以使用列表切片:
您可以使用列表理解:
相关问题 更多 >
编程相关推荐