Verwenden der Python-Zeichenfolgenformatierung mit Listen

111

Ich konstruiere eine Zeichenfolge sin Python 2.6.5, die eine unterschiedliche Anzahl von %sToken enthält, die der Anzahl der Einträge in der Liste entsprechen x. Ich muss eine formatierte Zeichenfolge schreiben. Das Folgende funktioniert nicht, zeigt aber an, was ich versuche zu tun. In diesem Beispiel gibt es drei %sToken und die Liste enthält drei Einträge.

s = '%s BLAH %s FOO %s BAR'
x = ['1', '2', '3']
print s % (x)

Ich möchte, dass die Ausgabezeichenfolge lautet:

1 BLAH 2 FOO 3 BAR

SabreWolfy
quelle

Antworten:

112
print s % tuple(x)

anstatt

print s % (x)
Infrarot
quelle
5
(x)ist das gleiche wie x. Das Einfügen eines einzelnen Tokens in Klammern hat in Python keine Bedeutung. Normalerweise setzen Sie Klammern ein foo = (bar, ), um das Lesen zu erleichtern, foo = bar,tun aber genau das Gleiche.
Patrys
11
print s % (x)ist das, was OP geschrieben hat, ich habe ihn / sie nur zitiert.
Infrarot
Ich habe nur einen Sprachtipp gegeben und Ihre Antwort nicht kritisiert (tatsächlich habe ich sie + 1 gegeben). Du hast auch nicht geschrieben foo = (bar, ):)
patrys
2
Ich benutze die (x)Notation zur Klarheit; Außerdem wird vermieden, dass die Klammern vergessen werden, wenn Sie später zusätzliche Variablen hinzufügen.
SabreWolfy
Wie wäre es, wenn Sie Ihre Variablen aus mehreren Listen beziehen möchten? Tupel nimmt nur eine einzige Liste, und der Formatierer scheint nur ein einziges Tupel zu nehmen
errant.info
150

Sie sollten sich die Formatierungsmethode von Python ansehen . Sie können Ihre Formatierungszeichenfolge dann folgendermaßen definieren:

>>> s = '{0} BLAH BLAH {1} BLAH {2} BLAH BLIH BLEH'
>>> x = ['1', '2', '3']
>>> print s.format(*x)
'1 BLAH BLAH 2 BLAH 3 BLAH BLIH BLEH'
Cédric Julien
quelle
1
Das Problem des OP ist nicht die Methode, sondern das Format der Parameter. %Der Bediener packt nur Tupel aus.
Patrys
Dies würde die Konstruktion skomplexer machen, da ich inkrementierende Zahlen einschließen müsste und nicht nur %sfür jede Position. swird in verschiedenen Schritten aufgebaut, so dass es viel einfacher ist, nur das %sToken einzuschließen.
SabreWolfy
2
@SabreWolfy Wenn Sie es vorab erstellen, fällt es Ihnen möglicherweise leichter, Ihre Platzhalter zu benennen und die resultierende Zeichenfolge mit einem Diktat zu formatieren : print u'%(blah)d BLAHS %(foo)d FOOS …' % {'blah': 15, 'foo': 4}.
Patrys
2
@ SabreWolfy: In Python 2.7 können Sie die s = '{} BLAH {} BLAH BLAH {} BLAH BLAH BLAH'
Feldnummern
Diese Antwort ist möglicherweise verwirrend, da es so aussieht, als ob die numerischen Werte von 0, 1 und 2 in irgendeiner Weise damit zusammenhängen, wie oft das Wort "BLAH" vorkommt.
SabreWolfy
31

Wenn die Länge von x auf dieser Ressourcenseite variiert, können wir Folgendes verwenden:

', '.join(['%.2f']*len(x))

um einen Platzhalter für jedes Element aus der Liste zu erstellen x. Hier ist das Beispiel:

x = [1/3.0, 1/6.0, 0.678]
s = ("elements in the list are ["+', '.join(['%.2f']*len(x))+"]") % tuple(x)
print s
>>> elements in the list are [0.33, 0.17, 0.68]
Neobot
quelle
1
Der Link ist jetzt tot.
MK Hunter
19

Hier ist ein Einzeiler. Eine kleine improvisierte Antwort mit Format mit print () zum Durchlaufen einer Liste.

Wie wäre es damit (Python 3.x):

sample_list = ['cat', 'dog', 'bunny', 'pig']
print("Your list of animals are: {}, {}, {} and {}".format(*sample_list))

Lesen Sie hier die Dokumente zur Verwendung von format () .

geekidharsh
quelle
18

Da ich gerade etwas über diese coole Sache gelernt habe (Indizierung in Listen innerhalb einer Formatzeichenfolge), füge ich dieser alten Frage hinzu.

s = '{x[0]} BLAH {x[1]} FOO {x[2]} BAR'
x = ['1', '2', '3']
print (s.format (x=x))

Ausgabe:

1 BLAH 2 FOO 3 BAR

Ich habe jedoch immer noch nicht herausgefunden, wie man in Scheiben schneidet (innerhalb der Formatzeichenfolge '"{x[2:4]}".format...), und würde es gerne herausfinden, wenn jemand eine Idee hat, aber ich vermute, dass Sie das einfach nicht können.

Joran Beasley
quelle
Ich bin ein wenig neugierig auf Ihren Anwendungsfall zum Schneiden.
Michael
1
Ich habe nicht wirklich eine ... Ich denke, ich dachte nur, es wäre ordentlich, in der Lage zu sein
Joran Beasley
11

Das war eine lustige Frage! Eine andere Möglichkeit, dies für Listen mit variabler Länge zu handhaben, besteht darin, eine Funktion zu erstellen, die die .formatMethode und das Entpacken von Listen voll ausnutzt . Im folgenden Beispiel verwende ich keine ausgefallene Formatierung, aber diese kann leicht an Ihre Bedürfnisse angepasst werden.

list_1 = [1,2,3,4,5,6]
list_2 = [1,2,3,4,5,6,7,8]

# Create a function that can apply formatting to lists of any length:
def ListToFormattedString(alist):
    # Create a format spec for each item in the input `alist`.
    # E.g., each item will be right-adjusted, field width=3.
    format_list = ['{:>3}' for item in alist] 

    # Now join the format specs into a single string:
    # E.g., '{:>3}, {:>3}, {:>3}' if the input list has 3 items.
    s = ','.join(format_list)

    # Now unpack the input list `alist` into the format string. Done!
    return s.format(*alist)

# Example output:
>>>ListToFormattedString(list_1)
'  1,  2,  3,  4,  5,  6'
>>>ListToFormattedString(list_2)
'  1,  2,  3,  4,  5,  6,  7,  8'
Matt P.
quelle
3

Das gleiche wie die Antwort von @ neobot, aber etwas moderner und prägnanter.

>>> l = range(5)
>>> " & ".join(["{}"]*len(l)).format(*l)
'0 & 1 & 2 & 3 & 4'
Ryanjdillon
quelle
0
x = ['1', '2', '3']
s = f"{x[0]} BLAH {x[1]} FOO {x[2]} BAR"
print(s)

Die Ausgabe ist

1 BLAH 2 FOO 3 BAR
arun na
quelle