【问题标题】:Iteritems on a slice of a list列表切片上的迭代项
【发布时间】:2015-01-24 21:38:27
【问题描述】:

iteritems 上的dict 很有用。

有时iteritems 对列表的一部分很有用,可以(粗略地)如下实现:

import itertools

class List(list):
  def iteritems(self, slice=None):
    if slice is None: return enumerate(self)
    else: return itertools.izip(range(slice.start,slice.stop,slice.step), self[slice])

if __name__ == "__main__":
  l=List("hAnGtEn")
  print l
  print list(l.iteritems())
  print list(l.iteritems(slice(1,7,2)))

输出:

['h', 'A', 'n', 'G', 't', 'E', 'n']
[(0, 'h'), (1, 'A'), (2, 'n'), (3, 'G'), (4, 't'), (5, 'E'), (6, 'n')]
[(1, 'A'), (3, 'G'), (5, 'E')]

是否应该使用更“pythonic”的列表切片语法?

附言

range(slice.start,slice.stop,slice.step) 

不能很好地处理某些特殊情况:例如其中stop=-1start=Nonestep=None。如何改进示例范围/切片实现?

【问题讨论】:

标签: python list iteration subclass slice


【解决方案1】:

您可以为此使用iterools.islice

创建一个从可迭代对象中返回选定元素的迭代器。如果 start 不为零,则跳过 iterable 中的元素,直到到达 start。之后,元素将连续返回,除非 step 设置为高于 1 导致项目被跳过。如果 stop 为 None,则迭代继续,直到迭代器耗尽(如果有的话);否则在指定位置停止。

但是,文档还指出它不支持开始、停止或步进的负值。

【讨论】:

    猜你喜欢
    • 2010-11-23
    • 2015-02-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-10-26
    • 2020-05-08
    • 2023-01-08
    • 1970-01-01
    相关资源
    最近更新 更多