Zip in IronPython 2.7 and Python3.5

I have a script that I want to execute in both Python3.5 and IronPython2.7.

The script was originally written with Python3 in mind, so I have several nested loops similar to the following code:

myIter0 = iter(['foo','foo','bar','foo','spam','spam']) myIter1 = iter(['foo','bar','spam','foo','spam','bar']) myIter2 = iter([1,2,3,4,5,6]) for a in myIter0: for b, c in zip(myIter1, myIter2): if a + b == 'foobar': print(c) break 

Now, if I run this in IronPython2.7, I do not get the same result, because zip returns a list, not an iterator.

To get around this problem, I thought what I would do:

 import sys if sys.version_info.major == 2: from itertools import izip as _zip else: _zip = zip myIter0 = iter(['foo','foo','bar','foo','spam','spam']) myIter1 = iter(['foo','bar','spam','foo','spam','bar']) myIter2 = iter([1,2,3,4,5,6]) for a in myIter0: for b, c in _zip(myIter1, myIter2): if a + b == 'foobar': print(c) break 

Is there a better way to do this?

+5
source share
3 answers

You can use builtins from future lib.

 from builtins import zip 

In python2 you get itertools.izip , and in python3 you just get zip.

 In [1]: from builtins import zip In [2]: zip([1,2,3,4]) Out[2]: <itertools.izip at 0x7fa16c8496c8> In [1]: from builtins import zip In [2]: zip([1,2,3,4]) Out[2]: <zip at 0x7f13dfb9c188> 
+3
source

It looks quite reasonable to me. A small modification will avoid explicit verification of the version number by doing

 try: from itertools import izip as zip_ except ImportError: # Python 3 zip_ = zip 
+2
source

For Python3.5 Users

 A=[1,2,3,4,5,6,7] B=[7,6,5,4,32,1] In: c=list(zip(A,B)) In: print(c) out: [(1,7),(2,6),(3,5),(4,4),(5,3),(6,2),(7,1)] 
-1
source

Source: https://habr.com/ru/post/1247965/


All Articles