【问题标题】:Python loop to [:-1]Python循环到[:-1]
【发布时间】:2011-05-26 04:48:31
【问题描述】:

所以,我注意到调用array[:-1] 将克隆数组。

假设我有一个包含 3000 个元素的大型数组。我不希望它在迭代时被克隆!我只想迭代到倒数第二个。

for item in array[ :-1 ] :
  # do something with the item

所以我必须求助于一个计数器变量,

for c in range( 0, len( array ) - 1 ) :
  # do something with array[ c ]

或者有没有办法让array[:-1] 语法变得高效?

【问题讨论】:

  • 遗憾的是,“其他问题”完全错过了itertools。因此,我投票结束这个问题。
  • @pst 对另一个问题发表更好的答案难道不是“正确的做法”吗?

标签: python list performance


【解决方案1】:
for item in itertools.islice(array, len(array) - 1):

【讨论】:

    【解决方案2】:

    查看itertools.islice:

    from itertools import islice
    for item in islice(array, 0, len(array) - 1):
        # do something with item
    

    这大约是您想要的一半;它不需要说array[i],但不需要指定len(array) - 1

    就其价值而言,3000 件物品对于现代计算机来说不算什么,除非您的程序明显变慢并且您已对其进行分析以确定这段代码是促成因素,否则我不会担心效率低下。

    【讨论】:

      【解决方案3】:

      当你不想/不能/不知道序列的长度时:

      def allbutlast(seq):
        it = iter(seq)
        el = next(it)
        for e in it:
          yield el
          el = e
      
      for i in allbutlast([1, 2, 3]):
        print i
      

      【讨论】:

        【解决方案4】:

        我从未使用过这个特定的 itertools 函数,但看起来 islice 会做你想做的事

        http://docs.python.org/library/itertools.html#itertools.islice

        【讨论】:

          猜你喜欢
          • 2012-04-10
          • 2012-09-19
          • 2021-10-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-03-06
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多