繁体   English   中英

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

[英]Comparable code to array[++i] and array[i++] in Python?

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

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

现在我知道这不能用Python完成(出于各种 原因 )。 但是,我不禁想知道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];

我的意思是它是关于索引的增量,而不是特定字符串的查找。

也许:

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是一个字符串,那么最短的pythonic版本显然是:

smileyDetected = ':)' in array

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

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

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

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异常。 你需要抓住它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM