Python 如何反方向迭代一个序列

问题

你想反方向迭代一个序列

解决方案

使用内置的 reversed() 函数,比如:

>>> a = [1, 2, 3, 4]
>>> for x in reversed(a):
...   print(x)
...
4
3
2
1

反向迭代仅仅当对象的大小可预先确定或者对象实现了 __reversed__() 的特殊方法时才能生效。如果两者都不符合,那你必须先将对象转换为一个列表才行,比如:

# Print a file backwards
f = open('somefile')
for line in reversed(list(f)):
  print(line, end='')

要注意的是如果可迭代对象元素很多的话,将其预先转换为一个列表要消耗大量的内存。

讨论

很多程序员并不知道可以通过在自定义类上实现 __reversed__() 方法来实现反向迭代。比如:

class Countdown:
  def __init__(self, start):
    self.start = start

  # Forward iterator
  def __iter__(self):
    n = self.start
    while n > 0:
      yield n
      n -= 1

  # Reverse iterator
  def __reversed__(self):
    n = 1
    while n <= self.start:
      yield n
      n += 1

for rr in reversed(Countdown(30)):
  print(rr)
for rr in Countdown(30):
  print(rr)

定义一个反向迭代器可以使得代码非常的高效,因为它不再需要将数据填充到一个列表中然后再去反向迭代这个列表。

以上就是Python 如何反方向迭代一个序列的详细内容,更多关于Python 反向迭代的资料请关注我们其它相关文章!

(0)

相关推荐

  • Python从list类型、range()序列简单认识类(class)【可迭代】

    本文实例讲述了Python从list类型.range()序列简单认识类(class).分享给大家供大家参考,具体如下: list类型 定义: items = [] 这就定义了一个名叫items的list. 往里填充数据: items.append(1) items.append(3) items.append(4) print(items) # [1, 3, 4] range序列 上面那个list,如果我们要append进去0~9的数字.最好是利用循环. items = [] for x in

  • python-序列解包(对可迭代元素的快速取值方法)

    一般情况下 x,y,z = 1,2,3 print("x:",x) print("y:",y) print("z:",z) #运行结果 x: 1 y: 2 z: 3 对元祖序列解包 name = ("qiaobushi","wanglihong","leibushi") x,y,z = name print(name) print("x:",x) print(&quo

  • Python同时迭代多个序列的方法

    问题 你想同时迭代多个序列,每次分别从一个序列中取一个元素. 解决方案 为了同时迭代多个序列,使用 zip() 函数.比如: >>> xpts = [1, 5, 4, 2, 10, 7] >>> ypts = [101, 78, 37, 15, 62, 99] >>> for x, y in zip(xpts, ypts): ... print(x,y) ... 1 101 5 78 4 37 2 15 10 62 7 99 >>>

  • Python for循环通过序列索引迭代过程解析

    这篇文章主要介绍了Python for循环通过序列索引迭代过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 Python for 循环通过序列索引迭代: 注:集合 和 字典 不可以通过索引进行获取元素,因为集合和字典都是无序的. 使用 len (参数) 方法可以获取到遍历对象的长度. 程序: strs = "Hello World." # 使用 len 方法可以获取到遍历对象的长度. print(len(strs)) # 12

  • python如何实现反向迭代

    本文实例为大家分享了python实现反向迭代的具体代码,供大家参考,具体内容如下 案例: 实现一个连续的浮点数发生器,FloatRange,根据给定范围(start, end) 和步进值,产生一些列的浮点数,例如:FloatRange(3,4,0.2),将产生下列序列: 正向:3.0 3.2 -- 4.0 反向:4.0 3.8 -- 3.0 如何实现? 方法1:列表翻转 #!/usr/bin/python3 l = [1, 2, 3, 4, 5, 6] l.reverse() for i in

  • python使用 zip 同时迭代多个序列示例

    本文实例讲述了python使用 zip 同时迭代多个序列.分享给大家供大家参考,具体如下: zip 可以平行地遍历多个迭代器 python 3中zip相当于生成器,遍历过程中产生元祖,python2会把元祖生成好,一次性返回整份列表 zip(x,y,z)会生成一个可返回元组 (x,y,z) 的迭代器 >>> x = [1, 2, 3, 4, 5] >>> y = ['a', 'b', 'c', 'd', 'e'] >>> z = ['a1', 'b2'

  • Python 如何反方向迭代一个序列

    问题 你想反方向迭代一个序列 解决方案 使用内置的 reversed() 函数,比如: >>> a = [1, 2, 3, 4] >>> for x in reversed(a): ... print(x) ... 4 3 2 1 反向迭代仅仅当对象的大小可预先确定或者对象实现了 __reversed__() 的特殊方法时才能生效.如果两者都不符合,那你必须先将对象转换为一个列表才行,比如: # Print a file backwards f = open('some

  • python计算一个序列的平均值的方法

    本文实例讲述了python计算一个序列的平均值的方法.分享给大家供大家参考.具体如下: def average(seq, total=0.0): num = 0 for item in seq: total += item num += 1 return total / num 如果序列是数组或者元祖可以简单使用下面的代码 def average(seq): return float(sum(seq)) / len(seq) 希望本文所述对大家的Python程序设计有所帮助.

  • python实现输出一个序列的所有子序列示例

    如下所示: def sub(arr): finish=[] size = len(arr) end = 1 << size #end=2**size for index in range(end): # shift index array = [] for j in range(size): # 00,01,10,11 is symmetrical if (index >> j) % 2: # this result is 1, so do not have to write ==

  • 浅谈Python中的可迭代对象、迭代器、For循环工作机制、生成器

    1.iterable iterator区别 要了解两者区别,先要了解一下迭代器协议: 迭代器协议是指:对象需要提供__next__()方法,它返回迭代中的元素,在没有更多元素后,抛出StopIteration异常,终止迭代. 可迭代对象就是:实现了迭代器协议的对象. 协议是一种约定,可迭代对象实现迭代器协议,Python的内置工具(如for循环,sum,min,max函数等)通过迭代器协议访问对象,因此,for循环并不需要知道对象具体是什么,只需要知道对象能够实现迭代器协议即可. 迭代器(ite

  • python 使用值来排序一个字典的方法

    下面先看下python 使用值排序字典的方法 In [8]: a={'x':11,'y':22,'c':4} In [9]: import operator In [10]: sorted(a.items(),key=operator.itemgetter(1)) Out[10]: [('c', 4), ('x', 11), ('y', 22)] In [11]: a={'x':11,'y':22,'c':4} In [12]: sorted(a.items(),key=lambda x:x[1

  • python学习之可迭代对象、迭代器、生成器

    Iterable – 可迭代对象 能够逐一返回其成员项的对象. 可迭代对象的例子包括所有序列类型 (例如 list, str 和 tuple) 以及某些非序列类型例如 dict, 文件对象以及定义了__iter__()方法或是实现了序列语义的__getitem__() 方法的任意自定义类对象. 可迭代对象可用于 for 循环以及许多其他需要一个序列的地方(zip().map() -).当一个可迭代对象作为参数传给内置函数 iter() 时,它会返回该对象的迭代器.这种迭代器适用于对值集合的一次性

  • python入门课程第五讲之序列和字符串

    目录 前言 序列 序列是什么? 有哪些序列类型呢? 1. 按照能存储的元素划分 2. 按照是否可变划分 序列都有哪些方法以及特性呢? 序列的索引 序列切片 序列相加 序列相乘 检查元素是否包含在序列中 序列相关的内置函数 字符串 字符串的定义 原始字符串的处理 字符串的分割方法 字符串拼接的方法 总结 牛刀小试一下吧 参考答案 本文主要介绍Python数据类型中序列和字符串,文末有彩蛋哦 干货满满,建议收藏,用到时常看常新. 小伙伴们如有问题及需要,请留言告诉我哦~ ~ ~. 前言 上一篇文章我

  • 稳扎稳打学Python之容器 可迭代对象 迭代器 生成器专题讲解

    目录 一.容器 1.什么是容器? 二.可迭代对象 1.什么是可迭代对象? 三.迭代器 四.序列 五.列表推导式 六.生成器 1.生成器的第一种创建方法:生成器表达式 2.生成器的第二种创建方法:yield 七.小结 今天就来给大家讲讲Python中的容器.可迭代对象.迭代器和生成器这些难理解的概念,让你的Python基础更上一层楼! 一.容器 1.什么是容器? 在Python中,容器是把多种元素组织在一起的数据结构,容器中的元素就可以逐个迭代获取.说白了,它的作用就像它的名字一样:用来存放东西(

随机推荐