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

时间:2016-05-14 15:38:49

标签: python c++ c

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

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

现在我知道这不能在Python中完成(对于various reasons)。但是,我不禁想知道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];

我的意思是关于索引的递增,而不是特定字符串的发现。

3 个答案:

答案 0 :(得分:2)

也许:

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

答案 1 :(得分:1)

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

smileyDetected = ':)' in array

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

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

答案 2 :(得分:0)

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

var startDate = moment("2016-06-01");
var stopDate = moment("2016-09-29"):
var dateArr = [];
var interval = moment.twix(startDate, stopDate).iterate('days');
while (interval.hasNext()) {
  dateArr.push(interval.next().format('YYYY-MM-DD'))
};

console.log(dateArr);

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

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 ,那么在耗尽的迭代器上调用:会得到StopIteration异常。你需要抓住它。