2016-04-26 13 views
5

Ho uno script che voglio eseguire sia in Python3.5 che in IronPython2.7.zip in IronPython 2.7 e Python3.5

Lo script è originariamente scritto con python3 in mente, in modo da avere alcuni cicli annidati simili al codice qui sotto:

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 

Ora, se corro questo IronPython2.7 io non ottenere lo stesso risultato perché zip restituisce un elenco e non un iteratore.

per aggirare questo problema, ho pensato di fare:

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 

Esiste un modo migliore per fare questo?

+0

Forse sto ancora troppo sonno, ma qual è il problema con 'zip' restituendo una lista in python2? O è specifico per IronPython? –

+0

Il problema è che 'zip (myIter1, myIter2)' usa tutti gli elementi in 'myIter1' e' myIter2' in Python2. Il programma non rientra nel ciclo 'for' nidificato poiché' zip (myIter1, myIter2) 'è un iteratore vuoto dopo la prima iterazione del ciclo principale. –

+2

Cosa dire di ['six.zip()'] (https://pythonhosted.org/six/)? – pzp

risposta

3

È possibile utilizzare builtins dal future lib.

from builtins import zip 

In python2 si ottiene un itertools.izip e in python3 basta avere 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> 
+0

@JacquesGaudin, devi installarlo 'pip install future', se vuoi scrivere codice per python2 e 3 allora dovresti installarlo –

+0

In realtà' from future_builtins import zip' funziona senza installare il futuro! –

+0

@JacquesGaudin, funzionerà in python2 ma non in python3, non c'è 'future_builtins'. –

2

Questo sembra perfettamente ragionevole per me. Una piccola modifica vi permetterà di evitare la versione esplicita controllo del numero effettuando

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

Grazie. In realtà, ho una tale impostazione di prova all'inizio del mio script per rilevare la disponibilità di altre funzioni, quindi sarebbe facile da incorporare. –

-1

Per gli utenti Python3.5,

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)] 
+0

Questa risposta tardiva non si riferisce alla domanda. –