首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
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
V2EX  ›  Python

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

  •  
  •   zscself · 263 天前 · 2636 次点击
    这是一个创建于 263 天前的主题,其中的信息可能已经有所发展或是发生改变。

    有一个 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
        1
    mayorbryant   263 天前
    其他方法也是利用索引来实现的,这个已经是很简洁的方式了
        2
    lxy42   263 天前
    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]:
        3
    fngtz   263 天前 via iPhone
    collections.deque
        4
    Cl2ex   263 天前
    for p in zip(l,l[1:]):
    print p
        5
    weeevv   263 天前 via Android
    [x for x in zip(l[:-1],l[1:,])]
        6
    kaneg   263 天前
    不用索引:

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

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

    那本质上就是个单向链表,循环里存上一个值呗。
        8
    xpresslink   263 天前   ♥ 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)]
    >>>
        9
    Raisu   263 天前
    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]

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

    https://docs.python.org/3.7/library/itertools.html
        11
    di94sh   263 天前
    ```python
    l = [1, 3, 5, 7, 11, 13, 17]
    x = zip(l[0:-1], l[1:])
    print(list(x))
    ```
        12
    darknoll   263 天前
    >>> def fn(l):
    ... if len(l) < 2:
    ... return
    ... i,*args = l
    ... yield (i, args[0])
    ... fn(args)
        13
    fngtz   263 天前 via iPhone
    @ruoyu0088 找到一位真 pythoneer
        14
    fcfangcc   263 天前
    @ruoyu0088 厉害,学习了
        15
    xpresslink   263 天前
    @fngtz 仔细看一下我#8 我写的,也算是一位吧
        16
    cxyfreedom   263 天前 via iPhone
    @ruoyu0088 长见识了,很 pythonic
        17
    shn7798   263 天前
    @xpresslink 看了下,跟 pairwise 原理一样,不过相比之下就不 pythonic 了哈哈
        18
    xpresslink   263 天前
    @shn7798 用那个 tee 我知道,我只是为演示一下最本质的东西,没必要多 import 一下。
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   1036 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 27ms · UTC 19:02 · PVG 03:02 · LAX 11:02 · JFK 14:02
    ♥ Do have faith in what you're doing.