天道酬勤,学无止境

iterator

copying iterators and producing unordered self-cartesian product

Say I have a list, and I want to produce a list of all unique pairs of elements without considering the order. One way to do this is: mylist = ['W','X','Y','Z'] for i in xrange(len(mylist)): for j in xrange(i+1,len(mylist)): print mylist[i],mylist[j] W X W Y W Z X Y X Z Y Z I want to do this with iterators, I thought of the following, even though it doesn't have brevity: import copy it1 = iter(mylist) for a in it1: it2 = copy.copy(it1) for b in it2: print a,b But this doesn't even work. What is a more pythonic and efficient way of doing this, with iterators or zip, etc.?

2021-09-25 09:08:40    分类:问答    python   list   iterator   cartesian-product

Get length of a (non infinite) iterator inside it's loop using Python 2.7

I'm working with some iterator generated using itertools.imap, and I was thinking if there is a way to access the iterator length inside the for-loop that I use to loop over the elements. What I can say for sure is that the iterator doesn't generate an infinite amount of data. Also, because the information I'm looping are from a query to a database, I can get the length of the information from there, but the function I'm using has to return an iterator. I thought of some options: def iterator_function(some, arguments, that, I, need): query_result = query() return_iterator = itertools.imap(

2021-09-25 05:56:58    分类:问答    python   python-2.7   for-loop   iterator   itertools

在 Java 中使用迭代器的多个 If 条件(Multiple If conditions using Iterator in Java)

问题 我有一个包含元素 1 到 10 的列表。我尝试从中删除素数 2,3,5,7,然后使用迭代器打印列表的其余部分。但是此代码抛出NoSuchElementException 。 这是我的代码: public static void editerate2(Collection<Integer> list3) { Iterator<Integer> it=list3.iterator(); while(it.hasNext()) { if(it.next()==2 || it.next()==3 || it.next() ==5 || it.next()==7 ) { it.remove(); } } System.out.println("List 3:"); System.out.println("After removing prime numbers : " + list3); } 这样做的正确方法是什么? 另外使用“|”有什么区别和“||” ??? 回答1 每次调用it.next()迭代器都会前进到下一个元素。 我假设这不是你想要做的。 你应该这样做: Iterator<Integer> it = list.iterator(); while (it.hasNext()) { Integer thisInt = it.next(); if (thisInt == 2 ||

2021-09-24 03:49:20    分类:技术分享    java   collections   iterator

Multiple If conditions using Iterator in Java

I have a list which has elements 1 through 10. I try to remove the prime numbers 2,3,5,7 from it and then print the rest of the list using iterator.But this code throws a NoSuchElementException. this is my code : public static void editerate2(Collection<Integer> list3) { Iterator<Integer> it=list3.iterator(); while(it.hasNext()) { if(it.next()==2 || it.next()==3 || it.next() ==5 || it.next()==7 ) { it.remove(); } } System.out.println("List 3:"); System.out.println("After removing prime numbers : " + list3); } What's the correct way of doing this? Also what's the difference between using "|"

2021-09-24 02:43:37    分类:问答    java   collections   iterator

How to 'flatten' generators in python?

I have a problem with 'flattening' out some generators in python. Here is my code: import itertools as it test = [[1,2,3],[4,5],[6,7,8]] def comb(possible): if len(possible) != 1: for a in possible[0]: yield from it.product((a,), comb(possible[1:])) else: yield from possible[0] list(comb(test)) which gives me: [(1, (4, 6)), (1, (4, 7)), (1, (4, 8)), (1, (5, 6)), (1, (5, 7)), (1, (5, 8)), (2, (4, 6)), (2, (4, 7)), (2, (4, 8)), (2, (5, 6)), (2, (5, 7)), (2, (5, 8)), (3, (4, 6)), (3, (4, 7)), (3, (4, 8)), (3, (5, 6)), (3, (5, 7)), (3, (5, 8))] However, I want something like: [(1, 4, 6), (1, 4, 7)

2021-09-24 00:56:59    分类:问答    python   recursion   iterator   itertools   yield

Different results with Iterator for Java Framework Collection

I have some questions about the different behaviors of Iterator on the main Java Framework Collection classes (not only for the List class). List If I write for-each I will have an exception: Collection<String> cc= new ArrayList<>(3); cc.add("Cio"); cc.add("Mio"); cc.add("Tio"); for (String s:cc) { System.out.println(s); cc.remove(s); //Exception } If I use the Iterator, I will have not an exception: for (Iterator<String> it =cc.iterator(); it.hasNext();) { String s =it.next(); if (s.startsWith("C")) it.remove(); } ArrayDeque This is different for ArrayDeque, infact if I use for-each, I will

2021-09-23 23:47:55    分类:问答    java   collections   foreach   iterator

类似指针的类和 ->* 运算符(Pointer-like classes and the ->* operator)

问题 我最近遇到需要将指向成员的指针应用于迭代器指定的对象。 我试过自然语法: ite->*ptr = 42; 令我沮丧的是,它没有编译。 迭代器不会重载operator->* ,但更令人惊讶的是智能指针也不会。 我需要诉诸以下笨拙: (*ite).*ptr = 42; 实验(参见下面的实例)表明,对于自定义类,至少从 C++14 开始,对于成员指针和成员函数指针来说,这样的语法似乎是可以实现的。 因此 : 标准指针类是否有理由不重载operator->* ,还是只是一个疏忽? 在定义我自己的类似指针的类时,我应该重载operator->*还是同样的原因适用于我? 实时示例——什么编译,什么不编译,以及自定义类的概念证明。 回答1 您可以使用自由函数重载->* 。 它不必是会员。 template <typename P, typename T, typename M> M& operator->* (P smartptr, M T::*ptrmem) { return (*smartptr).*ptrmem; } 现在所有定义了一元运算operator*东西(迭代器、智能指针等等)也可以使用->* 。 您可能希望以一种更可控的方式来完成它,即分别为已知的迭代器、已知的智能指针等定义它。 由于显而易见的原因,这不适用于成员函数。 对于这种情况,需要专门化/重载并返回绑定的std

2021-09-23 22:45:25    分类:技术分享    c++   iterator   operator-overloading   c++14   smart-pointers

为什么生成器更快?(Why are generators faster?)

问题 我知道生成器比迭代器快。 我也知道可以使用for循环语法来实现生成器。 例如: import time startT = time.time() def myGen(n): for i in range(n): yield x def myIter(n): for i in range(n): pass def main(): n=100 startT=time.time() myIter(n) print 'myIter took ', time.time() - startT startT=time.time() myGen(n) print 'myGen(n) took ', time.time() - startT 这只是结果的一个例子: myIter took 0.09234782 myGen(n) took 0.017847266 由于这使用for循环语法,所以我不明白它比迭代器更快。 该生成器使用迭代器,因为“for”循环是使用迭代器实现的。 如果您对这些进行计时,则生成器始终会更快。 这是为什么,当生成器使用迭代器时? 谢谢。 回答1 在您的代码中, myIter(n)实际上确实有效——它循环了 100 次。 另一方面, myGen(n)只是构建生成器——就是这样。 它不算到 100。您所做的只是对构建对象所需的时间进行计时

2021-09-23 19:07:40    分类:技术分享    python   iterator   generator

通用 C++ 多维迭代器(Generic C++ multidimensional iterators)

问题 在我当前的项目中,我正在处理多维数据结构。 底层文件按顺序存储(即一个巨大的数组,没有向量的向量)。 使用这些数据结构的算法需要知道各个维度的大小。 我想知道是否已经以通用方式在某处定义了多维迭代器类,以及是否有任何标准或首选方法来解决这个问题。 目前我只是使用带有一些附加方法的线性迭代器,这些方法返回每个维度的大小以及第一部分中有多少维度。 我不喜欢它的原因是因为我不能以合理的方式使用 std:: distance 例如(即只返回整个结构的距离,而不是分别返回每个维度)。 在大多数情况下,我将以线性方式访问数据结构(第一个维度开始到结束 -> 下一个维度 +...等等),但最好知道一个维度何时“结束”。 在这种方法中,我不知道如何仅使用 operator*()、operator+() 和 operator==() 来做到这一点。 不赞成使用向量方法,因为我不想拆分文件。 此外,算法必须在具有不同维度的结构上运行,因此很难概括(或者可能有办法?)。 Boost multi_array 也有同样的问题(迭代器的多个“级别”)。 我希望这不是太模糊或抽象。 任何正确方向的提示将不胜感激。 我自己又在寻找解决方案,并重新审视了 boost::multi_array。 事实证明,可以使用它们生成数据的子视图,但同时也可以在顶层采用直接迭代器并隐式地“扁平化”数据结构。 但是

2021-09-22 08:23:58    分类:技术分享    c++   algorithm   multidimensional-array   iterator

如何解压缩迭代器?(How to unzip an iterator?)

问题 给定一对xys列表,将其解压缩为两个列表的 Python 习惯用法是: xs, ys = zip(*xys) 如果xys是一个迭代器,我如何将它解压缩为两个迭代器,而不将所有内容都存储在内存中? 回答1 假设您有一些可迭代的对: a = zip(range(10), range(10)) 如果我正确解释了您的要求,您可以使用 itertools.tee 为第一秒和第二秒生成独立的迭代器: xs, ys = itertools.tee(a) xs, ys = (x[0] for x in xs), (y[1] for y in ys) 请注意,这会将您迭代其中一个与另一个之间的“差异”保留在内存中。 回答2 如果您想独立于另一个使用一个迭代器,则无法避免将内容拉入内存,因为其中一个迭代器会进行,而另一个不会(因此必须缓冲)。 这样的事情允许您迭代对的“左项”和“右项”: import itertools import operator it1, it2 = itertools.tee(xys) xs = map(operator.itemgetter(0), it1)) ys = map(operator.itemgetter(1), it2)) print(next(xs)) print(next(ys)) ...但请记住,如果您只使用一个迭代器,另一个将在内存中缓冲项目

2021-09-21 13:16:52    分类:技术分享    python   iterator   generator   itertools