推荐学习书目
› Learn Python the Hard Way
Python Sites
› PyPI - Python Package Index
› http://diveintopython.org/toc/index.html
› Pocoo
值得关注的项目
› PyPy
› Celery
› Jinja2
› Read the Docs
› gevent
› pyenv
› virtualenv
› Stackless Python
› Beautiful Soup
› 结巴中文分词
› Green Unicorn
› Sentry
› Shovel
› Pyflakes
› pytest
Python 编程
› pep8 Checker
Styles
› PEP 8
› Google Python Style Guide
› Code Style from The Hitchhiker's Guide
zscself
V2EX  ›  Python

Python3 如何做到操作一次迭代两次

  •  
  •   zscself ·
    firedent · Mar 18, 2019 · 5463 views
    This topic created in 2788 days ago, the information mentioned may be changed or developed.

    有一个 List

    l = [1, 3, 5, 7, 11, 13, 17]
    

    现在想通过迭代输出成如下:

    [1, 3]
    [3, 5]
    [5, 7]
    [7, 11]
    [11, 13]
    [13, 17]
    

    除了用索引还有其他办法吗?

    for i in range(len(l)-1):
    	print(l[i:i+2])
    
    18 replies  •  2019-03-18 22:17:58 +08:00
    mayorbryant
    mayorbryant
    Mar 18, 2019
    1
    其他方法也是利用索引来实现的,这个已经是很简洁的方式了
    lxy42
    lxy42
    Mar 18, 2019
    2
    In [143]: l = [1, 3, 5, 7, 11, 13, 17]

    In [144]: for i, j in zip(l[:-1], l[1:]):
    ...: print(i, j)
    ...:
    1 3
    3 5
    5 7
    7 11
    11 13
    13 17

    In [145]:
    fngtz
    fngtz
    Mar 18, 2019 via iPhone
    3
    collections.deque
    Cl2ex
    Cl2ex
    Mar 18, 2019
    4
    for p in zip(l,l[1:]):
    print p
    weeevv
    weeevv
    Mar 18, 2019 via Android
    5
    [x for x in zip(l[:-1],l[1:,])]
    kaneg
    kaneg
    Mar 18, 2019
    6
    不用索引:

    last = None
    for i in l:
    if last:
    print '[%s,%s]' % (last, i)
    last = i
    fngtz
    fngtz
    Mar 18, 2019 via iPhone
    7
    之前我没回答清楚。

    这个问题最方便当然是 zip 列表推导式,但是别人问不要索引啊!就是说 l 是个迭代器。

    那本质上就是个单向链表,循环里存上一个值呗。
    xpresslink
    xpresslink
    Mar 18, 2019❤️1
    8
    如果使用直线性思维模式:
    >>> l = [1, 3, 5, 7, 11, 13, 17]
    >>> i = iter(l)
    >>> j = iter(l); next(j)
    1
    >>> list(zip(i,j))
    [(1, 3), (3, 5), (5, 7), (7, 11), (11, 13), (13, 17)]
    >>>
    Raisu
    Raisu
    Mar 18, 2019
    9
    l = [1, 3, 5, 7, 11, 13, 17]

    pre = l[0]
    for i in range(1, len(l)):
    print([pre, l[i]])
    pre = l[i]

    用一直变量保存前一个数,大概这样可以?
    ruoyu0088
    ruoyu0088
    Mar 18, 2019 via Android❤️9
    10
    文档里面有,在下面的页面搜索 pairwise

    https://docs.python.org/3.7/library/itertools.html
    di94sh
    di94sh
    Mar 18, 2019
    11
    ```python
    l = [1, 3, 5, 7, 11, 13, 17]
    x = zip(l[0:-1], l[1:])
    print(list(x))
    ```
    darknoll
    darknoll
    Mar 18, 2019
    12
    >>> def fn(l):
    ... if len(l) < 2:
    ... return
    ... i,*args = l
    ... yield (i, args[0])
    ... fn(args)
    fngtz
    fngtz
    Mar 18, 2019 via iPhone
    13
    @ruoyu0088 找到一位真 pythoneer
    fcfangcc
    fcfangcc
    Mar 18, 2019
    14
    @ruoyu0088 厉害,学习了
    xpresslink
    xpresslink
    Mar 18, 2019
    15
    @fngtz 仔细看一下我#8 我写的,也算是一位吧
    cxyfreedom
    cxyfreedom
    Mar 18, 2019 via iPhone
    16
    @ruoyu0088 长见识了,很 pythonic
    shn7798
    shn7798
    Mar 18, 2019
    17
    @xpresslink 看了下,跟 pairwise 原理一样,不过相比之下就不 pythonic 了哈哈
    xpresslink
    xpresslink
    Mar 18, 2019
    18
    @shn7798 用那个 tee 我知道,我只是为演示一下最本质的东西,没必要多 import 一下。
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Privacy   ·   Solana   ·   3781 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 49ms · UTC 05:32 · PVG 13:32 · LAX 21:32 · JFK 00:32
    ♥ Do have faith in what you're doing.