- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
例如,我有以下字符串:
s = "string"
我正在尝试为这个字符串对象维护一个迭代器。
it = iter(s)
我知道我可以使用循环并使用 next
调用递增 it
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 切片方法获取子字符串:
例如:
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 中递增迭代器?如果不是,那么我可以使用迭代器当前指向的元素的索引,我该怎么做?
最佳答案
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
现在,给定 any 迭代器it
,您可以将其包装到 AugmentedIterator
中,并且您可以随时调用 peek()
检查当前元素。
请注意,没有 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)
关于python - Python中的递增迭代器(iter),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22994730/
我正在实现一个算法,当用户输入字符串时,字符串中的每个字符(如果是字母表)都应该增加给定的值(这里是旋转器)。我正在玩这个代码 2 小时,但无法弄清楚为什么当我按值旋转器递增时,它会按 rotator
我有 1.0.5。我怎样才能增加到 1.0.6? 试过了,但是不行。 echo 1.0.5 0.0.1 | awk '{sum=$1+$2; printf"%0.2f\n", sum }' 最佳答案
这个问题在这里已经有了答案: Behaviour of increment and decrement operators in Python (11 个回答) Why are there no ++
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 这个问题似乎偏离主题,因为它缺乏足够的信息来诊断问题。 更详细地描述您的问题或 include a mini
我正在尝试温习我的 C,我有以下代码,当我使用 i 偏移量但不使用 Hold++ 时,它可以工作,我不明白为什么我认为他们做了同样的事情?这是我无法开始工作的版本: char* reversestri
我需要增加/减少 PostgreSQL 数据库中的计时。 下面是包含列类型为"timestamp without time zone" 的表的输出 如果时间超过 24 小时,我也需要更改日期。请协助
我有一个名为 temp_rfm 的表,其中 col1 实际上是客户 ID(我有一个非法的联盟混合问题)和 calc_date 是增加月份的开始。 SELECT * FROM temp_rfm ; co
我目前正在处理我的应用程序的首选项,我必须设置一个角度。默认值约为 30°,用户应该能够调整此角度以使其最适合。 我不只是制作一个普通的 EditTextPreference,而是希望它可以像在其他应
这个问题已经有答案了: Increment a number by prefix and postfix operator (1 个回答) 已关闭去年。 我正在努力理解 Javascript 增量运算
我使用下面的 javascript 递归地重新加载一个目标 DIV,其 id="outPut",将参数传递给 getData.php 时执行数据查询的结果>。问题是 fadeTo 会淡化每次迭代调用返
这个问题在这里已经有了答案: 关闭 10 年前。 Possible Duplicate: Jquery Draggable + Bring to Front 我有一个网站,用户可以在其中打开多个聊天
我必须定义一个函数,其中: Starting with a positive integer original, keep multiplying original by n and calculat
我正在我的应用程序中记录一些统计数据。其中一项统计数据是 BigDataStructure 的大小。我有两个选择: 创建一个计数器并递增/每次递减计数器有一个添加/删除大数据结构。 每次添加/删除从
在下面的 Java 示例程序中,我得到了无限循环,我不明白为什么: public class Time { public static int next(int v) { re
我从 C#/WPF 添加了一个意外的行为 private void ButtonUp_Click(object sender, RoutedEventArgs e) {
我想在 Python 2.7 中增加用户提供的字符串的最后一位数字。 我可以这样替换第一个数字: def increment_hostname(name): try: numb
我正在用蛮力搜索具有某些属性的 float (sin(a)^2+cos(a)^2-1 的小舍入误差)。因此,我想通过递增尾数来遍历给定 float 的邻域。 在 C 中是否有一种简单的方法可以做到这一
C 标准将 _Bool 定义为包含 0 或 1 的无符号类型。如果 _Bool 类型的值 1 递增,据我所知,有两个选项: 该值在 1 到 0 之间环绕 该值增加到 2,它是非零值,因此在转换回 _B
我有一个 INI 文件,其中存储了一些用于设置的整数。部分名称存储如下: [ColorScheme_2] name=Dark Purple Gradient BackgroundColor=224 B
我的应用程序中有这个方法: - (void)initializeTimer{ self.myTimer = [NSTimer scheduledTimerWithTimeInterval:th
我是一名优秀的程序员,十分优秀!