我有以下字符串例如:
s = "string"
我正在尝试维护这个字符串对象的迭代器。
it = iter(s)
我知道我可以使用循环并使用it
调用增加next
for i in range(0, len(s)):
print(next(it))
这将打印此字符串中的所有字符。
但我有一些事情我希望迭代器可以在std::list
上使用C ++迭代器。
1。)返回迭代器当前指向的元素。
// In C++, I would do,
std::string str = "string";
std::string::iterator it = str.begin();
*it; // gets the value of element
2。)获取迭代器所在元素的索引。
这样我就可以使用Python切片方法获取子字符串:
E.g:
s = "string"
s[0:iter_index_in_integer]
在C ++中,我可以使用迭代器:
std::string str = "string";
std::string::iterator it = str.begin();
std::string(it, it+3);
是否可以在Python中增加迭代器?如果没有,那么我可以使用迭代器当前指向的元素索引,我该怎么做?
答案 0 :(得分:2)
Python的内置功能不会提供任何允许您获取当前元素的内容。迭代器。迭代器必须支持的仅操作是next
,以获取以下元素和推进迭代。
然而,编写实现其他操作的自己的迭代器非常简单:
class AugmentedIterator(object):
_sentinel = object()
def __init__(self, iterator):
self.iterator = iterator
self.value = self._sentinel
def __iter__(self):
return self
def __next__(self):
if self.value is not self._sentinel:
self.value, val = self._sentinel, self.value
return val
return next(self.iterator)
def peek(self, default=_sentinel):
if self.value is not self._sentinel:
return self.value
try:
self.value = next(self.iterator)
except StopIteration:
if default is not self._sentinel:
return default
raise
else:
return self.value
现在,给定任何迭代器it
,您可以将其包装到AugmentedIterator
中,只要您愿意,您可以调用peek()
来检查当前元素。< / p>
请注意,没有end()
这样的东西,因为迭代器很容易变得无限。了解迭代器是否还有其他元素的唯一方法是调用next
并查看它是否会引发StopIteration
。
对于第二个请求,您可以使用itertools.islice
来获取迭代器的一部分。但请注意islice
执行 python 切片,它允许越界索引:
In [19]: list(islice('string', 0, 1000))
Out[19]: ['s', 't', 'r', 'i', 'n', 'g']
这里索引1000
因为它比字符串长度大,所以意味着:直到结束。这与切片一致:
In [20]: 'string'[:1000]
Out[20]: 'string'
在C ++中,如果字符串的长度为6,则在尝试使用it+1000
时会出错。(不是100%肯定,但由于指针是可迭代的,所以至少肯定会遇到麻烦在一些情况下)。
通常,itertools
包中包含许多有用的函数(在文档的最后有一些使用它们的配方)。 Python还提供了一些与迭代器相关的函数,例如:
enumerate
:迭代元素并获取相对索引。map
/ filter
/ reduce
iter(callable, sentinel)
:允许您在没有参数的情况下获取迭代器:
for chunk in iter(lambda: file_object.read(4096), ''):
handle(chunk)
相当于:
while True:
chunk = file_object.read(4096)
if chunk == '':
break
handle(chunk)
答案 1 :(得分:0)
您可以使用内置enumerate()
功能:
for index, element in enumerate(mystring):
print index
print element
答案 2 :(得分:0)
您可以执行以下操作:
import itertools
s = "mystring"
s2 = ''.join(itertools.islice(s, 0, 3))
但实际上,不应该尝试直接翻译C ++习语,而应该找到Pythonic方法来做任何你想做的事情,无论如何这最终可能会变得更简洁。