Python中的array[++i]和array[i++]的可比代码?

Posted

技术标签:

【中文标题】Python中的array[++i]和array[i++]的可比代码?【英文标题】:Comparable code to array[++i] and array[i++] in Python? 【发布时间】: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 【参考方案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 运算符是短路的。对于给定的搜索模式,这是可行的,因为它不能以 ) 开头,因此是否跳过 ) 无关紧要。

以上是关于Python中的array[++i]和array[i++]的可比代码?的主要内容,如果未能解决你的问题,请参考以下文章

python中array函数怎么用

机器学习入门

冒泡排序(python版)

Python中Array的常用操作数组基本操作

python 归纳 (二十)_多进程数据共享和同步_共享内存Value & Array

python中的list和array的不同之处