标签: iterator

在python的循环中确定您正在进行的迭代

基本上我希望能够在循环迭代中告诉我何时在第N个项目上.有什么想法吗?

d = {1:2, 3:4, 5:6, 7:8, 9:0}

for x in d:
    if last item: # <-- this line is psuedo code
        print "last item :", x
    else:
        print x
Run Code Online (Sandbox Code Playgroud)

python dictionary iterator loops

12
推荐指数
2
解决办法
2万
查看次数

在java中连接多个迭代器

有人知道如何在Java中加入多个迭代器吗?我发现的解决方案首先迭代一个迭代器,然后继续下一个迭代器.但是,我想要的是当next()被调用时,它首先返回第一个迭代器中的第一个元素.下次调用next()时,它将返回第二个迭代器中的第一个元素,依此类推.

谢谢

java iterator

12
推荐指数
1
解决办法
9393
查看次数

是否有一种优雅的方式通过迭代循环遍历列表N次(如itertools.cycle但限制循环)?

我想通过迭代器重复遍历列表(N次),以便不在列表中实际存储N个副本.有没有内置或优雅的方式来做到这一点,而无需编写自己的发电机?

理想情况下,itertools.cycle(my_list)会有第二个参数来限制它循环的次数...唉,没有这样的运气.

python iterator

12
推荐指数
5
解决办法
2089
查看次数

为什么std :: max_element需要ForwardIterator?

C++标准库的max_element算法需要将迭代器作为模型的输入传递ForwardIterator.

我的理解是通过指定您可以使用a 多次迭代相同的范围来ForwardIterator提炼.因此,多遍算法需要s.InputIteratorForwardIteratorForwardIterator

但是,max_element不是多遍算法 - 只需迭代一次范围就可以确定其最大元素.那么为什么max_element需要额外的功能ForwardIterator呢?

c++ iterator stl max stl-algorithm

12
推荐指数
1
解决办法
453
查看次数

ES6使用for..of反向迭代一个数组,我错过了规范中的内容吗?

在ES6中,我们现在有迭代器for..of来迭代它们.我们有一些数组内置函数 ; 特别是,条目.

这些方法允许人们执行通常执行的大部分迭代.但是,反向迭代怎么样?这也是一个非常常见的任务,我没有在规范中看到任何具体的内容吗?或许我错过了?

好的,我们有Array.prototype.reverse但是我不一定想要在适当的位置反转大型数组,然后在完成时再次反转它.我也不想使用Array.prototype.slice来制作一个临时的浅拷贝并反转那个迭代.

所以我看了一下发电机并提出了这些有效的解决方案.

(function() {
  'use strict';

  function* reverseKeys(arr) {
    let key = arr.length - 1;

    while (key >= 0) {
      yield key;
      key -= 1;
    }
  }

  function* reverseValues(arr) {
    for (let key of reverseKeys(arr)) {
      yield arr[key];
    }
  }

  function* reverseEntries(arr) {
    for (let key of reverseKeys(arr)) {
      yield [key, arr[key]];
    }
  }

  var …
Run Code Online (Sandbox Code Playgroud)

javascript arrays reverse iterator ecmascript-6

12
推荐指数
1
解决办法
5348
查看次数

如何使用索引和值迭代1d NumPy数组

对于python dict,我可以使用iteritems()同时循环键和值.但我找不到NumPy阵列的这种功能.我必须idx像这样手动跟踪:

idx = 0 
for j in theta:
   some_function(idx,j,theta)
   idx += 1
Run Code Online (Sandbox Code Playgroud)

有一个更好的方法吗?

python arrays indexing iterator numpy

12
推荐指数
2
解决办法
2万
查看次数

C++迭代器的生命周期和有效性是什么?

我打算在C++中实现一个Things列表,其中的元素可能会被无序删除.我不希望我需要任何类型的随机访问(我只需要定期扫描列表),项目的顺序也不重要.

所以我想std::list<Thing*> with this->position = insert(lst.end(), thing)应该做的伎俩.我希望Thing类能够记住每个实例的位置,以便以后可以轻松地完成lst.erase(this->position).

但是,我对C++ STL容器仍然有点新意,我不知道将迭代器保持这么长时间是否安全.特别是,考虑到在插入Thing之前和之后将删除其他元素.

c++ iterator stl object-lifetime

11
推荐指数
1
解决办法
4161
查看次数

是 - >为迭代器my_map.end()定义的第二个?

我正在和一个人一起工作std::map<std::string, MyClass* >.

我想测试是否my_map.find(key)返回特定指针.

现在我正在做;

auto iter = my_map.find(key);
if ((iter != my_map.end()) && (iter->second == expected)) {
    // Something wonderful has happened
}
Run Code Online (Sandbox Code Playgroud)

但是,operator *迭代器的位置需要返回引用.直觉我认为它是有效的并完全初始化?如果是这样,那my_map.end()->second将是NULL,并且(因为NULL从未预料到),我可以将我的if语句减少为:

if (iter->second == expected)
Run Code Online (Sandbox Code Playgroud)

这是否符合规范?有没有人有实际经验?恕我直言,代码变得更加清晰,可能会实现微小的性能提升.

c++ iterator stl

11
推荐指数
1
解决办法
3297
查看次数

标准库中的boost :: make_transform_iterator相当于什么?

处理const向量时,以下方法不起作用:

const std::vector<std::string> v;
v.push_back("test"); // error: v cannot be modified
Run Code Online (Sandbox Code Playgroud)

相反,您必须在构造它的同一行初始化向量.但是,即使有这个限制,boost::make_transform_iterator也可以在将它们推入v之前轻松地使用另一个vector的元素.在这个例子中,convert是一个返回输入元素的转换版本的一元函数:

auto beg = boost::make_transform_iterator(args.begin(), convert);
auto end = boost::make_transform_iterator(args.end(), convert);

const std::vector<const char*> vc { beg, end };
Run Code Online (Sandbox Code Playgroud)

我已经看了可用的功能<iterator>,但没有看到等效功能.它只是缺失或标准库没有它的原因吗?

c++ boost iterator c++11

11
推荐指数
1
解决办法
3507
查看次数

Scala for循环和迭代器

让我们假设我有一个非常大的可迭代值集合(大约100,000个字符串条目,逐个从磁盘读取),我在其笛卡尔积上做了一些事情(并将结果写回磁盘,但我不会在这里显示):

for(v1 <- values; v2 <- values) yield ((v1, v2), 1)
Run Code Online (Sandbox Code Playgroud)

我知道这只是另一种写作方式

values.flatMap(v1 => values.map(v2 => ((v1, v2), 1)))
Run Code Online (Sandbox Code Playgroud)

这显然导致每个flatMap迭代(甚至整个笛卡尔积?)的整个集合保存在内存中.如果你使用for循环读取第一个版本,这显然是不必要的.理想情况下,只应将两个条目(正在组合的条目)保存在内存中.

如果我重新制定第一个版本:

for(v1 <- values.iterator; v2 <- values.iterator) yield ((v1, v2), 1)
Run Code Online (Sandbox Code Playgroud)

内存消耗要低很多,这让我认为这个版本必须根本不同.它在第二个版本中的确有何不同?为什么Scala不会隐式使用第一个版本的迭代器?在某些情况下不使用迭代器时是否有任何加速?

谢谢!(还要感谢"lmm"谁回答了这个问题的早期版本)

iterator loops scala

11
推荐指数
2
解决办法
7609
查看次数