2013-05-04 7 views
6

Mi chiedevo se fosse possibile creare un one-liner con pyp con la stessa funzionalità di questo.Python one-liner (conversione di perl in pyp)

perl -l -a -F',' -p -e'if ($. > 1) { $F[6] %= 12; $F[7] %= 12;$_ = join(q{,}, @F[6,7]) }' 

Ciò avviene in un elenco separato di numeri con 8 numeri per riga e l'emette nello stesso formato tranne le ultime due numeri in ogni riga sono ridotti modulo 12. emette anche la prima riga (intestazione linea) prima testualmente.

Ho un sacco di questi oscuri perl one-liner e vorrei in primo luogo tradurli tutti in python.

+4

Huh, non ho mai saputo di pyp. Sembra utile – Blender

+2

Puoi mostrare quello che hai provato nell'implementazione di questo in PY e quanto hai ottenuto? Sei bloccato su qualcosa in particolare? – kojiro

+0

+1 per avermi fatto conoscere Pyp! – SethMMorton

risposta

4

Per la cronaca, non sono sicuro di approvare. Scrivere il codice orizzontalmente non mi sembra molto meglio che scriverlo in verticale, e - in un modo amichevole - Sono un po 'scettico, questo offre in pratica tanti vantaggi quanto potrebbe sembrare. Una delle gioie di Python è che non devi più preoccuparti di scrivere GolfScript.

Detto questo, come su:

pyp "mm | p if n==0 else (p[:-2] + [(int(x)%12) for x in p[-2:]]) | mm" 

che produce:

localhost-2:coding $ cat exam.pyp 
a,b,c,d,e,f,g,h 
11,22,33,44,55,66,77,88 
12,23,34,45,56,67,78,89 
13,24,35,46,57,68,79,80 
localhost-2:coding $ cat exam.pyp | pyp "mm | p if n==0 else (p[:-2] + [(int(x)%12) for x in p[-2:]]) | mm" 
a,b,c,d,e,f,g,h 
11,22,33,44,55,66,5,4 
12,23,34,45,56,67,6,5 
13,24,35,46,57,68,7,8 

[Disclaimer:. Questo è il mio primo-pyp programma, che ho scaricato una decina di minuti fa]

+0

C'è qualcosa di veramente rotto nella velocità di questo one-liner. Per un file con 500000 secondi la linea perl impiega <2 secondi. La linea dei pyp non sembra mai finire. Funziona bene su file molto piccoli. – marshall

+0

Ho appena creato un file di test di grandi dimensioni con per j in xrange (500000): print ",". Join (str (i) per i in [random.choice (xrange (1000)) per i in xrange (8)]) – marshall

+0

Pubblicato domanda separata http://stackoverflow.com/questions/16378512/python-one-liner-converting-perl-to-pyp. – marshall