标签: iterator

Python:StopIteration异常和列表推导

我想从csv文件中读取最多20行:

rows = [csvreader.next() for i in range(20)]
Run Code Online (Sandbox Code Playgroud)

如果文件有20行或更多行,则工作正常,否则失败并出现StopIteration异常.

有没有一种优雅的方法来处理迭代器,它可以在列表解析中抛出StopIteration异常,还是应该使用常规for循环?

python iterator list-comprehension stopiteration

10
推荐指数
1
解决办法
4863
查看次数

从顺序集合中获取随机元素

我谈到了一个API,它给了我java.util.Iterator一个集合.这意味着我可以迭代它,但我不能直接/随机访问元素.

现在我的问题:我想从这个集合中获得一个随机元素.我怎么做?我想我可以构建一个允许直接访问的新集合,但这不是一点消耗内存吗?我也可以迭代整个集合,并为每个元素"掷骰子",看看我是否应该采用该元素并退出迭代或继续.但后来我需要集合的大小,我无法从迭代器中获得.

提前致谢.

java iterator

10
推荐指数
2
解决办法
5570
查看次数

迭代一个STL容器而不是.begin()ing并回绕

我有一个std :: vector,简单来说就是整数.

std::vector<int> ivec;
ivec.push_back(1);
ivec.push_back(2);
... //omitting some push back's 3 to 99
ivec.push_back(100);
Run Code Online (Sandbox Code Playgroud)

迭代的标准方法是已知的

std::map<int>::iterator it;
for( it = ivec.begin(); it != ivec.end(); it++ ) 
  print();
Run Code Online (Sandbox Code Playgroud)

该迭代将打印1,2,3,... 100.

我想从预定义索引开始遍历所有向量元素,而不是从it.begin()遍历.我想打印

3,4,5,6 ... 99,100,1,2

你能在这里分享你的想法吗?

它可以分两步完成

for( it = ivec.begin()+index; it != ivec.end(); it++ ) and then (if index !=0)

for ( it = ivec.begin; it = it = ivec.begin() + (index-1); it++)
Run Code Online (Sandbox Code Playgroud)

c++ iterator vector std

10
推荐指数
2
解决办法
4415
查看次数

为什么需要对ForwardIterators建模DefaultConstructible?

我似乎无法找到任何标准算法来证明默认构造a的要求ForwardIterator.

是否有任何实际原因,或者我可以安全地忽略它?

c++ iterator

10
推荐指数
1
解决办法
384
查看次数

Iterator null集合

在不确定集合引用是否为null时,我必须在迭代之前检查null是很常见的.样品:

Collection<Object> collection = ...
...
if(collection != null)//troublesome
    for(Object o : collection)
Run Code Online (Sandbox Code Playgroud)

当然,我知道空集合比null要好得多,但在某些情况下,客户端代码无法控制来自其他模块的可空集合(例如,从第三方代码返回值).所以我写了一个实用工具方法:

public static <T> Iterable<T> nullableIterable(Iterable<T> it){
    return it != null ? it : Collections.<T>emptySet();
}
Run Code Online (Sandbox Code Playgroud)

在客户端代码中,不再需要检查null:

for(Object o : nullableIterable(collection))
...
Run Code Online (Sandbox Code Playgroud)

你认为nullableIterable()合理吗?有什么建议?有顾虑吗?谢谢!

java collections iterator

10
推荐指数
1
解决办法
1万
查看次数

std :: set :: iterator和std :: set :: const_iterator之间是否存在操作差异?

对于大多数容器,该iterator类型提供对容器中的值的读写访问,并且该const_iterator类型提供只读访问.但是,因为std::set<T>迭代器类型不能提供读写访问,因为修改集合中的值(可能)会破坏容器不变量.因此,在std::set<T>,无论是iteratorconst_iterator提供只读访问.

这引出了我的问题:你可以用a做std::set<T>::iterator的事情和用你做的事情之间有什么区别std::set<T>::const_iterator吗?

请注意,在C++ 11中,容器的操作方法(例如erase)可以带const_iterator参数.

c++ containers iterator set c++11

10
推荐指数
1
解决办法
955
查看次数

如何创建一个无限重复多个值的迭代器?

使用repeat我可以创建一个重复一个元素的迭代器.但是,如何无限重复多个值?例如:

let repeat_1 = repeat(1); // 1, 1, 1, 1, 1, 1, 1, 1, 1, ...
let repeat_123 = repeat([1, 2, 3]); // 1, 2, 3, 1, 2, 3, 1, 2, ... // or similar
Run Code Online (Sandbox Code Playgroud)

iterator rust

10
推荐指数
2
解决办法
2186
查看次数

使用泛型迭代器而不是特定的列表类型

我是Rust的新手,来自C#/ Java /类似.

在C#中,我们IEnumerable<T>可以使用它来迭代几乎任何类型的数组或列表.C#还有一个yield关键字,可用于返回惰性列表.这是一个例子......

// Lazily returns the even numbers out of an enumerable
IEnumerable<int> Evens(IEnumerable<int> input)
{
    foreach (var x in input)
    {
        if (x % 2 == 0)
        {
            yield return x;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这当然是一个愚蠢的例子.我知道我可以用Rust的map函数做到这一点,但我想知道如何创建自己的接受和返回泛型迭代器的方法.

从我可以收集到的内容,Rust具有可以类似使用的泛型迭代器,但它们超出了我的理解.我看到Iter,IntoIterator,Iterator类型,以及可能更多的文档,但没有很好地理解他们.

任何人都可以提供如何创建上述内容的明确示例吗?谢谢!

PS懒惰的方面是可选的.我更关心远离特定列表和数组类型的抽象.

arrays iterator vector rust

10
推荐指数
2
解决办法
2736
查看次数

PHP可迭代到数组或Traversable

我很高兴PHP 7.1引入了iterable伪类型.

现在虽然这只是循环遍历这种类型的参数很好,但是当你需要将它传递给只接受一个array或只是一个的PHP函数时,我不清楚该怎么做Traversable.例如,如果你想做一个array_diff,而你的iterable是a Traversable,你会得到一个array.相反,如果你调用一个带有Iterator的函数,如果iterable是一个,你会得到一个错误array.

有没有iterable_to_array(NOT :) iterator_to_arrayiterable_to_traversable

我正在寻找一种解决方案,避免我的函数中的条件只是为了处理这种差异,而这并不取决于我定义自己的全局函数.

使用PHP 7.1

php arrays iterator php-7 php-7.1

10
推荐指数
7
解决办法
3922
查看次数

消耗迭代器的最快(最Pythonic)方式

我很好奇消耗迭代器的最快方法是什么,以及最恐怖的方式.

例如,假设我想创建一个带有map内置函数的迭代器,它会积累一些副作用.我实际上并不关心结果map,只是副作用,所以我希望尽可能少地使用开销或样板来完成迭代.就像是:

my_set = set()
my_map = map(lambda x, y: my_set.add((x, y)), my_x, my_y)
Run Code Online (Sandbox Code Playgroud)

在这个例子中,我只是想通过迭代器来积累内容my_set,并且my_set只是一个空集,直到我实际运行my_map.就像是:

for _ in my_map:
    pass
Run Code Online (Sandbox Code Playgroud)

或赤身裸体

[_ for _ in my_map]
Run Code Online (Sandbox Code Playgroud)

工作,但他们都觉得笨重.是否有更多的Pythonic方法来确保迭代器快速迭代,以便您可以从一些副作用中受益?


基准

我在上面测试了上面的两种方法:

my_x = np.random.randint(100, size=int(1e6))
my_y = np.random.randint(100, size=int(1e6))
Run Code Online (Sandbox Code Playgroud)

my_setmy_map如上所定义.我用timeit获得了以下结果:

for _ in my_map:
    pass
468 ms ± 20.1 ms per loop (mean ± std. dev. of 7 runs, 1 loop each)

[_ for _ in my_map]
476 …
Run Code Online (Sandbox Code Playgroud)

python optimization iterator python-3.x

10
推荐指数
2
解决办法
966
查看次数