V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
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 · 2019-03-18 11:45:49 +08:00 · 4039 次点击
    这是一个创建于 2079 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有一个 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 条回复    2019-03-18 22:17:58 +08:00
    mayorbryant
        1
    mayorbryant  
       2019-03-18 11:55:12 +08:00
    其他方法也是利用索引来实现的,这个已经是很简洁的方式了
    lxy42
        2
    lxy42  
       2019-03-18 12:02:13 +08:00
    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
        3
    fngtz  
       2019-03-18 12:21:59 +08:00 via iPhone
    collections.deque
    Cl2ex
        4
    Cl2ex  
       2019-03-18 12:34:47 +08:00
    for p in zip(l,l[1:]):
    print p
    weeevv
        5
    weeevv  
       2019-03-18 12:40:45 +08:00 via Android
    [x for x in zip(l[:-1],l[1:,])]
    kaneg
        6
    kaneg  
       2019-03-18 12:49:11 +08:00
    不用索引:

    last = None
    for i in l:
    if last:
    print '[%s,%s]' % (last, i)
    last = i
    fngtz
        7
    fngtz  
       2019-03-18 12:58:25 +08:00 via iPhone
    之前我没回答清楚。

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

    那本质上就是个单向链表,循环里存上一个值呗。
    xpresslink
        8
    xpresslink  
       2019-03-18 14:05:06 +08:00   ❤️ 1
    如果使用直线性思维模式:
    >>> 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
        9
    Raisu  
       2019-03-18 15:11:33 +08:00
    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
        10
    ruoyu0088  
       2019-03-18 15:24:00 +08:00 via Android   ❤️ 9
    文档里面有,在下面的页面搜索 pairwise

    https://docs.python.org/3.7/library/itertools.html
    di94sh
        11
    di94sh  
       2019-03-18 15:28:57 +08:00
    ```python
    l = [1, 3, 5, 7, 11, 13, 17]
    x = zip(l[0:-1], l[1:])
    print(list(x))
    ```
    darknoll
        12
    darknoll  
       2019-03-18 16:55:10 +08:00
    >>> def fn(l):
    ... if len(l) < 2:
    ... return
    ... i,*args = l
    ... yield (i, args[0])
    ... fn(args)
    fngtz
        13
    fngtz  
       2019-03-18 17:01:24 +08:00 via iPhone
    @ruoyu0088 找到一位真 pythoneer
    fcfangcc
        14
    fcfangcc  
       2019-03-18 17:08:00 +08:00
    @ruoyu0088 厉害,学习了
    xpresslink
        15
    xpresslink  
       2019-03-18 18:59:42 +08:00
    @fngtz 仔细看一下我#8 我写的,也算是一位吧
    cxyfreedom
        16
    cxyfreedom  
       2019-03-18 19:12:49 +08:00 via iPhone
    @ruoyu0088 长见识了,很 pythonic
    shn7798
        17
    shn7798  
       2019-03-18 22:02:49 +08:00
    @xpresslink 看了下,跟 pairwise 原理一样,不过相比之下就不 pythonic 了哈哈
    xpresslink
        18
    xpresslink  
       2019-03-18 22:17:58 +08:00
    @shn7798 用那个 tee 我知道,我只是为演示一下最本质的东西,没必要多 import 一下。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   3250 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 12:56 · PVG 20:56 · LAX 04:56 · JFK 07:56
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.