标签: iterator

枚举() - 用Python生成一个生成器

我想知道当我将生成器函数的结果传递给python的enumerate()时会发生什么.例:

def veryBigHello():
    i = 0
    while i < 10000000:
        i += 1
        yield "hello"

numbered = enumerate(veryBigHello())
for i, word in numbered:
    print i, word
Run Code Online (Sandbox Code Playgroud)

枚举是否是懒惰地迭代,还是将所有内容都插入第一个?我99.999%肯定它很懒,所以我可以把它当作生成器功能完全相同,还是我需要注意什么?

python iterator generator enumerate

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

是否有Java等效的Python'枚举'函数?

在Python中,该enumerate函数允许您迭代一系列(索引,值)对.例如:

>>> numbers = ["zero", "one", "two"]
>>> for i, s in enumerate(numbers):
...     print i, s
... 
0 zero
1 one
2 two
Run Code Online (Sandbox Code Playgroud)

有没有办法在Java中这样做?

python java iterator

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

为什么Java不允许在迭代器上使用foreach(仅在迭代器上)?

可能重复:
为什么Java的迭代器不是Iterable?

在给定迭代器的情况下使用for-each循环的惯用方法?

我们可以使用for-each循环来迭代Iterator类型的对象吗?

据我所知,foreach循环是Java 5中添加的语法糖.所以

Iterable<O> iterable;
for(O o : iterable) {
    // Do something
}
Run Code Online (Sandbox Code Playgroud)

将基本上产生相同的字节码

Iterable<O> iterable;
for(Iterator<O> iter = iterable.iterator(); iter.hasNext(); /* NOOP */) {
    O o = iter.next();
    // Do something
}
Run Code Online (Sandbox Code Playgroud)

但是,如果我首先没有迭代,但只有一个迭代器(比如,因为一个类提供了两个不同的迭代器),我不能使用语法sugar foreach循环.显然我仍然可以做普通的旧式迭代.但是,我其实想做:

Iterator<O> iter;
for(O o : iter /* Iterator<O>, not Iterable<O>! */) {
     // Do something
}
Run Code Online (Sandbox Code Playgroud)

当然我可以做假的Iterable:

class Adapter<O> implements Iterable<O> {
    Iterator<O> iter;

    public Adapter(Iterator<O> iter) {
        this.iter = iter;
    }

    @Override
    public Iterator<O> iterator() {
        return iter; …
Run Code Online (Sandbox Code Playgroud)

java syntax iterator iterable language-design

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

如果range()是Python 3.3中的生成器,为什么我不能在一个范围上调用next()?

也许我已经成为网络上错误信息的牺牲品,但我认为这更可能只是因为我误解了某些东西.根据我到目前为止所学到的,range()是一个生成器,生成器可以用作迭代器.但是,这段代码:

myrange = range(10)
print(next(myrange))
Run Code Online (Sandbox Code Playgroud)

给我这个错误:

TypeError: 'range' object is not an iterator
Run Code Online (Sandbox Code Playgroud)

我在这里错过了什么?我期待这个打印0,并进入下一个值myrange.我是Python的新手,所以请接受我对这个相当基本的问题的道歉,但我无法在其他任何地方找到一个好的解释.

python iterator generator typeerror python-3.x

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

如何在Python中读取一行csv数据?

有很多使用python读取csv数据的例子,如下所示:

import csv
with open('some.csv', newline='') as f:
  reader = csv.reader(f)
  for row in reader:
    print(row)
Run Code Online (Sandbox Code Playgroud)

我只想读取一行数据并将其输入各种变量.我怎么做?我到处寻找一个有效的例子.

我的代码只检索i的值,而不检索其他值

reader = csv.reader(csvfile, delimiter=',', quotechar='"')
for row in reader:
  i = int(row[0])
  a1 = int(row[1])
  b1 = int(row[2])
  c1 = int(row[2])
  x1 = int(row[2])
  y1 = int(row[2])
  z1 = int(row[2])
Run Code Online (Sandbox Code Playgroud)

python csv iterator file next

68
推荐指数
7
解决办法
17万
查看次数

Rails:在数据库中没有元素时显示消息的优雅方式

我意识到我正在写很多类似于这个的代码:

<% unless @messages.blank? %>
  <% @messages.each do |message|  %>
    <%# code or partial to display the message %>
  <% end %>
<% else %>
  You have no messages.
<% end %>
Run Code Online (Sandbox Code Playgroud)

Ruby和/或Rails中是否有任何构造可以让我跳过第一个条件?所以当迭代器/循环不会进入一次时会执行?例如:

<% @messages.each do |message| %>
  <%# code or partial to display the message %>
<% and_if_it_was_blank %>
  You have no messages.
<% end %>
Run Code Online (Sandbox Code Playgroud)

ruby iterator loops ruby-on-rails

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

为什么Python中没有第一个(可迭代的)内置函数?

我不知道是否有一个原因,有没有first(iterable)在Python内置的功能,有点类似于any(iterable)all(iterable)(可能一STDLIB模块中夹着地方,但我没有看到它itertools).first将执行短路发生器评估,以便可以避免不必要的(和可能无限数量的)操作; 即

def identity(item):
    return item

def first(iterable, predicate=identity):
    for item in iterable:
        if predicate(item):
            return item
    raise ValueError('No satisfactory value found')
Run Code Online (Sandbox Code Playgroud)

这样你可以表达如下内容:

denominators = (2, 3, 4, 5)
lcd = first(i for i in itertools.count(1)
    if all(i % denominators == 0 for denominator in denominators))
Run Code Online (Sandbox Code Playgroud)

很明显,list(generator)[0]在这种情况下你不能这样做,因为发生器不会终止.

或者,如果你有一堆正则表达式匹配(当它们都具有相同的groupdict接口时很有用):

match = first(regex.match(big_text) for regex in regexes)
Run Code Online (Sandbox Code Playgroud)

通过避免list(generator)[0]和短路匹配来节省大量不必要的处理.

python iterator generator

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

矢量擦除迭代器

我有这个代码:

int main()
{
    vector<int> res;
    res.push_back(1);
    vector<int>::iterator it = res.begin();
    for( ; it != res.end(); it++)
    {
        it = res.erase(it);
        //if(it == res.end())
        //  return 0;
    }
}
Run Code Online (Sandbox Code Playgroud)

"一个随机访问迭代器,指向函数调用擦除的最后一个元素之后的元素的新位置,如果操作擦除了序列中的最后一个元素,则为向量结束."

此代码崩溃,但如果我使用if(it == res.end())然后返回它的工作原理.怎么会?for循环是否兑现了res.end(),因此不相等的运算符失败了?

c++ iterator vector

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

移动向量会使迭代器失效吗?

如果我有一个迭代到载体a,然后我布展构建体或移动指派矢量ba,是否仍迭代器指向同一元件(现在矢量b)?这就是我在代码中的意思:

#include <vector>
#include <iostream>

int main(int argc, char *argv[])
{
    std::vector<int>::iterator a_iter;
    std::vector<int> b;
    {
        std::vector<int> a{1, 2, 3, 4, 5};
        a_iter = a.begin() + 2;
        b = std::move(a);
    }
    std::cout << *a_iter << std::endl; // Is a_iter valid here?
    return 0;
}
Run Code Online (Sandbox Code Playgroud)

是否a_iter仍然有效的,因为a已移入b,或者是通过招无效的迭代器?作为参考,std::vector::swap 不会使迭代器无效.

c++ iterator c++11

66
推荐指数
3
解决办法
3834
查看次数

python JSON只获取第一级的密钥

我有一个非常漫长而复杂的json对象,但我只想获得第一级的项目/键!

例:

{
    "1": "a", 
    "3": "b", 
    "8": {
        "12": "c", 
        "25": "d"
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望得到1,3,8!

我找到了这段代码:

for key, value in data.iteritems():
    print key, value
Run Code Online (Sandbox Code Playgroud)

但它打印所有键(也是12和25)

python json iterator key python-2.7

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