Python提供了一种很好的方法来获取渴望迭代的长度,len(x)
也就是说.但是我找不到任何类似于生成器理解和函数所代表的惰性迭代.当然,写下这样的东西并不难:
def iterlen(x):
n = 0
try:
while True:
next(x)
n += 1
except StopIteration: pass
return n
Run Code Online (Sandbox Code Playgroud)
但我无法摆脱我重新实现自行车的感觉.
(当我输入这个函数时,一个想法让我大吃一惊:也许真的没有这样的功能,因为它"摧毁"了它的论点.虽然不是我的情况的问题).
PS:关于第一个答案 - 是的,类似的东西len(list(x))
也会起作用,但这会大大增加内存的使用.
PPS:重新检查......无视PS,似乎我在尝试时犯了一个错误,它运行正常.抱歉,添麻烦了.
我需要弄清楚Iterable
Java中的元素数量.我知道我可以这样做:
Iterable values = ...
it = values.iterator();
while (it.hasNext()) {
it.next();
sum++;
}
Run Code Online (Sandbox Code Playgroud)
我也可以这样做,因为我不再需要Iterable中的对象:
it = values.iterator();
while (it.hasNext()) {
it.remove();
sum++;
}
Run Code Online (Sandbox Code Playgroud)
一个小规模的基准测试没有表现出太大的性能差异,这个问题的任何评论或其他想法?
为什么不能在for循环中使用对象?或者这是一个浏览器错误?此代码在Chrome 42中不起作用,称undefined不是函数:
test = { first: "one"}
for(var item of test) {
console.log(item)
}
Run Code Online (Sandbox Code Playgroud) 这两个接口都只定义了一种方法
public operator fun iterator(): Iterator<T>
Run Code Online (Sandbox Code Playgroud)
文档说Sequence
是懒惰的.但是也不是Iterable
懒惰(除非由a支持Collection
)?
假设你有一个类似数组的Javascript ES6 Iterable,你事先知道它的长度是有限的,将它转换为Javascript数组的最佳方法是什么?
这样做的原因是许多js库(如下划线和lodash)仅支持Arrays,因此如果您希望在Iterable上使用它们的任何函数,则必须首先将其转换为Array.
在python中,您可以使用list()函数.在ES6中是否有相同的东西?
可能重复:
为什么Java的迭代器不是Iterable?
据我所知,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) Python的内置功能any(iterable)
可以帮助快速检查是否有bool(element)
是True
一个迭代的类型.
>>> l = [None, False, 0]
>>> any(l)
False
>>> l = [None, 1, 0]
>>> any(l)
True
Run Code Online (Sandbox Code Playgroud)
但是Python中有一种优雅的方式或功能可以达到相反的效果any(iterable)
吗?也就是说,如果有的bool(element) is False
话返回True
,如下例所示:
>>> l = [True, False, True]
>>> any_false(l)
>>> True
Run Code Online (Sandbox Code Playgroud) 在Java 5及更高版本中,你有foreach循环,它可以在任何实现的东西上神奇地工作Iterable
:
for (Object o : list) {
doStuff(o);
}
Run Code Online (Sandbox Code Playgroud)
但是,Enumerable
仍然没有实现Iterable
,这意味着迭代Enumeration
你必须执行以下操作:
for(; e.hasMoreElements() ;) {
doStuff(e.nextElement());
}
Run Code Online (Sandbox Code Playgroud)
有谁知道有没有理由Enumeration
仍然没有实现Iterable
?
在unittest中是否有一个"体面"的方法来检查两个可迭代对象的内容是否相等?我使用了很多元组,列表和numpy数组,我通常只想测试内容而不是类型.目前我只是在铸造这种类型:
self.assertEqual (tuple (self.numpy_data), tuple (self.reference_list))
Run Code Online (Sandbox Code Playgroud)
我刚才用这个列表理解:
[self.assertEqual (*x) for x in zip(self.numpy_data, self.reference_list)]
Run Code Online (Sandbox Code Playgroud)
但是这个解决方案看起来有点不如类型转换,因为它只会在单个值失败时打印单个值,并且对于不同长度的引用和数据也不会失败(由于zip函数).
如果我想要迭代中的项目数量而不关心元素本身,那么获得该元素的pythonic方法是什么?现在,我会定义
def ilen(it):
return sum(itertools.imap(lambda _: 1, it)) # or just map in Python 3
Run Code Online (Sandbox Code Playgroud)
但我明白lambda
接近被认为是有害的,lambda _: 1
当然不是很漂亮.
(这个用例是计算匹配正则表达式的文本文件中的行数,即grep -c
.)
iterable ×10
python ×4
java ×3
ecmascript-6 ×2
generator ×2
iterator ×2
javascript ×2
arrays ×1
assert ×1
babeljs ×1
enumeration ×1
for-loop ×1
kotlin ×1
python-3.x ×1
syntax ×1
unit-testing ×1