标签: iterator

Python类可以通过迭代器和索引访问

可能是一个n00b问题,但我目前有一个实现迭代器的类,所以我可以做类似的事情

for i in class():
Run Code Online (Sandbox Code Playgroud)

但我希望能够通过索引来访问类

class()[1]
Run Code Online (Sandbox Code Playgroud)

我怎样才能做到这一点?

谢谢!

python iterator list

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

在ArrayList上操作时,AbstractList.remove()中的UnsupportedOperationException

ArrayList的列表迭代器确实实现了remove方法,但是,我得到以下抛出的异常:

UnsupportedOperationException at java.util.AbstractList.remove(AbstractList.java:144)
Run Code Online (Sandbox Code Playgroud)

通过此代码:

protected void removeZeroLengthStringsFrom(List<String> stringList)
{
    ListIterator<String> iter = stringList.listIterator();
    String s;
    while (iter.hasNext())
    {
        s = iter.next();
        if (s.length() == 0)
        {
            iter.remove();
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么?我已经证实List<String>我传入的确是ArrayList<String>.

谢谢!

java iterator list arraylist

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

std :: map中的最后一个键

我正在寻找std :: map的最高键值(由比较运算符定义).

这是保证

map.rbegin()->first
Run Code Online (Sandbox Code Playgroud)

(我在反向迭代器上有点不稳定,在std :: map的实现中有多少自由度)

如果没有,请告知.我无法改变数据结构.

c++ iterator stdmap

42
推荐指数
4
解决办法
4万
查看次数

在Python文件对象上使用迭代器时,是否需要close()

执行以下操作并不显式处理文件对象并调用其close()方法是不好的做法吗?

for line in open('hello.txt'):
    print line
Run Code Online (Sandbox Code Playgroud)

注意 - 这是针对尚未拥有该with语句的Python版本.

我问,因为Python文档似乎推荐这个: -

f = open("hello.txt")
try:
    for line in f:
        print line
finally:
    f.close()
Run Code Online (Sandbox Code Playgroud)

这似乎比必要的更冗长.

python iterator file

42
推荐指数
7
解决办法
4万
查看次数

C#:foreach中的yield return失败 - body不能成为迭代器块

考虑一下混淆代码.目的是通过匿名构造函数及其动态创建一个新对象yield return.目标是避免仅仅为了维护本地集合return.

public static List<DesktopComputer> BuildComputerAssets()
{           
    List<string> idTags = GetComputerIdTags();

    foreach (var pcTag in idTags)
    {
        yield return new DesktopComputer() {AssetTag= pcTag
                                          , Description = "PC " + pcTag
                                          , AcquireDate = DateTime.Now
                                           };
    }            
}
Run Code Online (Sandbox Code Playgroud)

不幸的是,这段代码会产生异常:

错误28'Foo.BuildComputerAssets()'的主体不能是迭代器块,因为'System.Collections.Generic.List'不是迭代器接口类型

问题

  • 这个错误信息是什么意思?
  • 如何避免此错误并yield return正确使用?

c# iterator yield

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

在Go中创建迭代器的最惯用方法是什么?

一种选择是使用渠道.通道在某种程度上类似于迭代器,您可以使用range关键字迭代它们.但是当你发现你不能在没有泄漏goroutine的情况下突破这个循环时,使用会变得有限.

在go中创建迭代器模式的惯用方法是什么?

编辑:

渠道的根本问题在于它们是推模型.迭代器是拉模型.你不必告诉iterator停止.我正在寻找一种以一种很好的表达方式迭代集合的方法.我还想链接迭代器(map,filter,fold alternative).

iterator go

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

Python for循环和迭代器行为

我想了解更多iterators,所以如果我错了请纠正我.

迭代器是一个对象,它具有指向下一个对象的指针,并被读取为缓冲区或流(即链接列表).它们特别有效,因为它们只是通过引用而不是使用索引来告诉您接下来的内容.

但是我仍然不明白为什么会发生以下行为:

In [1]: iter = (i for i in range(5))

In [2]: for _ in iter:
   ....:     print _
   ....:     
0
1
2
3
4

In [3]: for _ in iter:
   ....:     print _
   ....:     

In [4]: 
Run Code Online (Sandbox Code Playgroud)

在通过迭代器(In [2])的第一个循环后,它就好像被消耗并留空,所以第二个循环(In [3])不打印任何内容.

但是我从未为iter变量赋予新值.

for循环的引擎下真正发生了什么?

python iterator

42
推荐指数
3
解决办法
3万
查看次数

反向迭代器在优化时返回垃圾

我有一个AsIterator模板类,它采用类似数字的类型,在这个例子中只是一个int,并将其转换为迭代器(++--递增和递减数字,并operator*只返回对它的引用).

这工作正常,除非它被包装成a std::reverse_iterator并使用任何优化编译(-O足够).当我优化二进制文件时,编译器去除reverse_iterator对它的取消引用调用,并用一些奇怪的值替换它.必须注意的是,它仍然可以进行正确的迭代次数.它只是反向迭代器获得的值,即垃圾.

请考虑以下代码:

#include <iterator>
#include <cstdio>

template<typename T>
class AsIterator : public std::iterator<std::bidirectional_iterator_tag, T> {
    T v;
public:
    AsIterator(const T & init) : v(init) {}

    T &operator*() { return v; }

    AsIterator &operator++() { ++v; return *this; }
    AsIterator operator++(int) { AsIterator copy(*this); ++(*this); return copy; }
    AsIterator &operator--() { --v; return *this; }
    AsIterator operator--(int) { AsIterator copy(*this); …
Run Code Online (Sandbox Code Playgroud)

c++ reverse iterator loops compiler-optimization

42
推荐指数
1
解决办法
1593
查看次数

我可以通过添加一个数字来增加迭代器吗?

我可以使用迭代器进行正常计算,即只需通过添加数字来增加它吗?

例如,如果我想删除元素vec[3],我可以这样做:

std::vector<int> vec;
for(int i = 0; i < 5; ++i){
      vec.push_back(i);
}
vec.erase(vec.begin() + 3); // removes vec[3] element
Run Code Online (Sandbox Code Playgroud)

它适用于我(g ++),但我不确定它是否可以保证工作.

c++ iterator

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

向后循环python字符串的最佳方法

向后循环python字符串的最佳方法是什么?

对于-1偏移的所有需要​​,以下似乎有点尴尬:

string = "trick or treat"
for i in range(len(string)-1, 0-1, -1):
    print string[i]
Run Code Online (Sandbox Code Playgroud)

以下看起来更简洁,但实际上它是否产生了反向字符串,因此会有轻微的性能损失?

string = "trick or treat"
for c in string[::-1]:
    print c
Run Code Online (Sandbox Code Playgroud)

python string optimization reverse iterator

41
推荐指数
5
解决办法
7万
查看次数

标签 统计

iterator ×10

python ×4

c++ ×3

list ×2

reverse ×2

arraylist ×1

c# ×1

compiler-optimization ×1

file ×1

go ×1

java ×1

loops ×1

optimization ×1

stdmap ×1

string ×1

yield ×1