2010-08-20 6 views
22

Ich tue dies eine Menge in Perl:Python entspricht dem Perl-qw()

printf "%8s %8s %8s\n", qw(date price ret); 

jedoch das Beste, was ich kann kommen in Python ist

print '%8s %8s %8s' % (tuple("date price ret".split())) 

Ich frage mich nur, wenn gibt es eine elegantere Art, es zu tun? Mir geht es gut, wenn Sie mir sagen, das ist es und keine Verbesserung kann gemacht werden.

+3

Warum ist das ein Community-Wiki? Dieses "Feature" muss wirklich entfernt werden. –

+0

Entschuldigung, ich muss die Wiki-Box falsch angeklickt haben. Wie entferne ich es? (Diese Option wird nicht angezeigt, wenn ich versuche, sie zu bearbeiten.) Was genau sollte eigentlich in das Community-Wiki geschrieben werden? Danke. – Zhang18

+0

Es kann nicht entfernt werden, betrachten Sie dies als eine Lektion für das nächste Mal. Die Idee hinter der Community-Wiki-Option ist wahrscheinlich am besten erklärt unter http://meta.stackexchange.com/questions/11740/what-are-community-wiki-posts –

Antwort

22

Nun, es gibt definitiv keine Möglichkeit, genau das zu tun, was Sie in Perl tun können, weil Python über nicht definierte Variablennamen und einen Syntaxfehler (fehlendes Komma, vielleicht) klagen wird. Aber ich es so schreiben würde (in Python 2.x):

print '%8s %8s %8s' % ('date', 'price', 'ret') 

Wenn Sie wirklich in Perl-Syntax angebracht sind, denke ich, eine Funktion qw wie folgt definieren könnte:

def qw(s): 
    return tuple(s.split()) 

und dann könnte man

print '%8s %8s %8s' % qw('date price ret') 

schreiben, das ist im Grunde Perl-like mit Ausnahme der ein Paar Zitate auf das Argument qw. Aber ich würde zögern, das zu empfehlen. Mach es zumindest nicht, nur weil du Perl vermisst - es ermöglicht nur deine Verleugnung, dass du jetzt in einer neuen Programmiersprache arbeitest ;-) Es ist wie die alte Geschichte über Pascal-Programmierer, die zu C wechseln und Makros erstellen

#define BEGIN { 
#define END } 
+7

Um sicher zu sein, versuchte ich explizit, Zitate um jedes Wort herum zu tippen. Die Wortliste läuft normalerweise in der Nähe von 15-20, daher die Notwendigkeit für qw() an erster Stelle. – Zhang18

+1

Nun, ich denke, der übliche Python-Weg, um es zu tun, ist nur saugen und tippen Sie die Zitate - schließlich müssen Sie es nur einmal tun. Aber ich nehme nicht an, dass es etwas wirklich _wrong_ mit der Verwendung dieser "qw" -Funktion gibt. Es könnte jeden verwirren, der Ihren Quellcode liest, der nicht mit Perl vertraut ist, aber wenn Sie damit leben können, gehen Sie gleich weiter. –

+3

"Schließlich müssen Sie es nur einmal tun" - außer, dass Sie es nur einmal tun müssen, jedes Mal, wenn Sie es tun müssen. Bevor ich regelmässig in Perl gecodiert habe, habe ich nie realisiert, wie oft ich Arrays aus einzelnen Token erstellt habe oder Hashes mit einzelnen Token für die Schlüssel erstellt habe (was eine weitere Möglichkeit ist, Anführungszeichen in Perl wegzulassen). Das "qw" ist nicht signifikant, es ist nur schön, eine allgemeine Falloptimierung zu haben, die es Ihnen ermöglicht, die Anführungszeichen zu entfernen. – umassthrower

9

"Datum Preis ret" .split()

+0

Das hat das OP bereits vorgeschlagen. Nicht wirklich hilfreich daher. –

0

QW() wird häufig verwendet, Spaltenüberschriften mit join() in Perl zu drucken. Spaltenköpfe in der realen Welt sind manchmal lang - machen join("\t", qw()) sehr nützlich, weil es leichter zu lesen ist und hilft, Tippfehler zu beseitigen (z. B. "x","y" oder "x\ty"). Im Folgenden ist ein verwandtes Konzept in Python reale Welt:

print("\t".join('''PubChemId Column ESImode Library.mzmed 
     Library.rtmed Metabolite newID Feature.mzmed Feature.rtmed 
     Count ppmDiff rtDiff'''.split())) 

Das dreifache Zitat String ist eine seltsame Sache, weil es als Kommentar verdoppelt. In diesem Kontext ist es jedoch eine Zeichenfolge, und es befreit uns davon, sich um Zeilenumbrüche kümmern zu müssen (wie).

Dank der vorherigen Antworten für diesen Ansatz.