【问题标题】:for x in y, type iteration in python. Can I find out what iteration I'm currently on?对于 x in y,在 python 中输入迭代。我可以找出我目前正在进行的迭代吗?
【发布时间】:2010-05-24 01:34:05
【问题描述】:

我有一个关于 Python 中循环结构的问题,形式为:for x in y: 在我的例子中,y 是从文件中读取的一行,x 是单独的字符。我想在输出中的每对字符之后放置一个空格,例如:aa bb cc dd 等。所以,我想知道当前的迭代。有可能吗,还是我需要使用更传统的 C 风格的带索引的循环?

【问题讨论】:

    标签: python iteration


    【解决方案1】:
    for i,x in enumerate(y):
        ....
    

    【讨论】:

    • 顺便说一句,在 i 和 x 之后的逗号之间放一个空格是不是很好?
    • 是的,在 i 和 x 之间留一个空格是很好的风格。
    【解决方案2】:

    使用enumerate:

    for index,x in enumerate(y):
        # do stuff, on iteration #index
    

    或者,只需创建一个变量并在循环体内递增它。不过,这并不像“pythonic”。

    cur = 0
    for x in y:
        cur += 1
        # do stuff, on iteration #cur
    

    【讨论】:

    • cur++ 太不合 Python 以至于会给出语法错误,所以很难推荐它;-)。我认为您的意思是cur+=1(至少可以工作,尽管与枚举相比它很糟糕;-)。
    • 谢谢。我最终使用了枚举。我不确定这有什么不同,但也许手动计数更清楚?咳咳,至少对于不太熟悉 Python 的人来说,看看代码。
    • @Alex,是的,我实际上刚刚搬进一个公寓。所以我现在有点疲惫。 (是的,enumerate 更漂亮。)
    • 如果您担心不熟悉 Python 的人会阅读您的代码,您可以随时添加一个简短的内联注释来解释枚举 - 但坦率地说,如果您明智地命名变量,它应该非常直观。 (如果不是,'python enumerate' 是一个简单的搜索!)我不会太担心。
    【解决方案3】:

    如果您正在做的是在每对字符之后插入一个空格,那么您可能需要使用以下列表推导式做一些事情:

    ' '.join([''.join(characterPair) for characterPair in zip(*[iter(line + ' ')] * 2)])
    

    在不附加额外空格的情况下,将丢弃奇数行的最后一个字符;加上空格,奇数个字符的行末尾会有一个额外的空格。

    (可能有一种比我所做的更 Pythonic 的方式。)

    【讨论】:

      【解决方案4】:

      我真的不能证明这比 enumerate 方法更好,但对于从 C 角度来看的人来说不太明显,所以我想我会指出它的完整性:

      from itertools import izip_longest
      ' '.join(j + k for j,k in izip_longest(fillvalue='', *([iter(line)]*2)))
      

      在 Python 中,通常更喜欢(或至少鼓励)使用生成器或列表推导来做一些这样的事情,而不是依赖于 enumerate

      这是itertools module documentationgrouper 方法的变体。

      【讨论】:

        猜你喜欢
        • 2017-08-04
        • 2012-06-04
        • 2011-09-20
        • 2012-12-13
        • 1970-01-01
        • 2011-12-22
        • 1970-01-01
        • 1970-01-01
        • 2011-03-26
        相关资源
        最近更新 更多