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++]的可比代码?的主要内容,如果未能解决你的问题,请参考以下文章