【问题标题】:Comparable code to array[++i] and array[i++] in Python?Python中的array[++i]和array[i++]的可比代码?
【发布时间】:2016-05-14 15:38:49
【问题描述】:

在 C 和 C++ 中,可以在 for 循环中更改索引(例如 i)。例如,这对于比较当前元素并基于该比较比较下一个元素很有用:

for(int i = 0; i < end; i++)
  if(array[i] == ':')
    if(array[++i] == ')')
      smileyDetected = true;

现在我知道这不能在 Python 中完成(对于variousreasons)。但是,我不禁想知道 Python 是否有简短的替代方案?我可以想出:

while i < end:
    if array[i] == ':':
        i += 1
        if array[i] == ')':
            smileyDetected = True;

但是,这会花费我额外的一行,除非您多次执行相同的操作(“可读性差”并不意味着文件很长),否则这听起来并不那么糟糕。所以要把它放在一行中,我会想到类似的东西 array[i += 1],但这似乎是无效的语法。

是否存在 Python 等效项,它在读取该递增索引的同一行中执行索引的递增?

编辑:
由于大多数答案提到使用in 查找子字符串,作为特定示例的替代方案,让我添加另一个无法以这种方式解决的示例:

j = 0;
for(int i = 0; i < end; i++)
  if(array[i] == ':')
    if(array[++i] == ')')
      anotherArray[j++] = array[++i];

我的意思是增加索引,而不是找到特定的字符串。

【问题讨论】:

  • 为什么不在个字符中迭代字符串?
  • 如果数组不是 C 字符串且 ':' 是最后一个字符,C/C++ 将显示未定义的行为。
  • 如果array 是一个字符串,你可以写成smiley_detected = ':)' in array
  • SImplify 像这样(非pythonic方式和语言不可知论) while i

标签: python c++ c


【解决方案1】:

也许:

smileyDetected = ':)' in "".join(array)

或根据@jonrsharpe:

from itertools import tee

# pairwise() from "Itertools Recipes"

def pairwise(iterable):
    "s -> (s0,s1), (s1,s2), (s2, s3), ..."
    a, b = tee(iterable)
    next(b, None)
    return zip(a, b)

for a, b in pairwise(array):
    if a == ':' and b == ')':
         smileyDetected = True

【讨论】:

  • 第一个是错的array = ['foo:', ')bar']
  • 请不要import *
  • @ValentinLorentz 您的示例与 OP 的示例代码不匹配,但我的第一个解决方案实际上可以正确处理它。最好将其发布为 jonrsharpe 对 OP 的成对评论的后续评论。
  • @cdlane 哦,对不起,我误解了这个问题(我以为是字符串数组而不是字符数组)
【解决方案2】:

如果array 是一个字符串,那么最短的pythonic 版本显然是:

smileyDetected = ':)' in array

一种更通用/非字符串特定的方法是使用迭代器:

smileyDetected = (':', ')') in zip(array, array[1:])

【讨论】:

    【解决方案3】:

    在这种特殊情况下,您可以这样做:

    for i, char in enumerate(array[:-1]):
        if char == ":" and array[i+1] == ")":
            smiley_detected = True
    

    但是,在更一般的情况下,如果您需要跳过元素,您可以修改原始迭代器:

    iterator = iter(array)
    for char in iterator:
        if char == ":" and next(iterator) == ")":
            smiley_detected = True
    

    这里你需要更加注意数组的边界;如果最后一个元素是:,您将在耗尽的迭代器上调用next 得到StopIteration 异常。你需要抓住它。

    【讨论】:

    • 第二个对于array = ['a', ':', ')', 'b'] 是错误的,因为它在每个循环的 same 迭代器上调用 next() 两次。
    • @ValentinLorentz 不,它只会在当前元素为: 时调用 next 两次,因为 and 运算符是短路的。对于给定的搜索模式,这是可行的,因为它不能以 ) 开头,因此是否跳过 ) 无关紧要。
    猜你喜欢
    • 2017-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-09-07
    • 2020-12-28
    • 1970-01-01
    • 2012-10-20
    • 1970-01-01
    相关资源
    最近更新 更多