在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];
我的意思是关于索引的递增,而不是特定字符串的发现。
答案 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
异常。你需要抓住它。