我想从csv文件中读取最多20行:
rows = [csvreader.next() for i in range(20)]
Run Code Online (Sandbox Code Playgroud)
如果文件有20行或更多行,则工作正常,否则失败并出现StopIteration异常.
有没有一种优雅的方法来处理迭代器,它可以在列表解析中抛出StopIteration异常,还是应该使用常规for循环?
我谈到了一个API,它给了我java.util.Iterator一个集合.这意味着我可以迭代它,但我不能直接/随机访问元素.
现在我的问题:我想从这个集合中获得一个随机元素.我怎么做?我想我可以构建一个允许直接访问的新集合,但这不是一点消耗内存吗?我也可以迭代整个集合,并为每个元素"掷骰子",看看我是否应该采用该元素并退出迭代或继续.但后来我需要集合的大小,我无法从迭代器中获得.
提前致谢.
我有一个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) 我似乎无法找到任何标准算法来证明默认构造a的要求ForwardIterator.
是否有任何实际原因,或者我可以安全地忽略它?
在不确定集合引用是否为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()合理吗?有什么建议?有顾虑吗?谢谢!
对于大多数容器,该iterator类型提供对容器中的值的读写访问,并且该const_iterator类型提供只读访问.但是,因为std::set<T>迭代器类型不能提供读写访问,因为修改集合中的值(可能)会破坏容器不变量.因此,在std::set<T>,无论是iterator和const_iterator提供只读访问.
这引出了我的问题:你可以用a做std::set<T>::iterator的事情和用你做的事情之间有什么区别std::set<T>::const_iterator吗?
请注意,在C++ 11中,容器的操作方法(例如erase)可以带const_iterator参数.
使用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) 我是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懒惰的方面是可选的.我更关心远离特定列表和数组类型的抽象.
我很高兴PHP 7.1引入了iterable伪类型.
现在虽然这只是循环遍历这种类型的参数很好,但是当你需要将它传递给只接受一个array或只是一个的PHP函数时,我不清楚该怎么做Traversable.例如,如果你想做一个array_diff,而你的iterable是a Traversable,你会得到一个array.相反,如果你调用一个带有Iterator的函数,如果iterable是一个,你会得到一个错误array.
有没有iterable_to_array(NOT :) iterator_to_array和iterable_to_traversable?
我正在寻找一种解决方案,避免我的函数中的条件只是为了处理这种差异,而这并不取决于我定义自己的全局函数.
使用PHP 7.1
我很好奇消耗迭代器的最快方法是什么,以及最恐怖的方式.
例如,假设我想创建一个带有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_set和my_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) iterator ×10
c++ ×3
arrays ×2
java ×2
python ×2
rust ×2
vector ×2
c++11 ×1
collections ×1
containers ×1
optimization ×1
php ×1
php-7 ×1
php-7.1 ×1
python-3.x ×1
set ×1
std ×1