Usando a formatação de string Python com listas


111

Eu construo uma string sem Python 2.6.5 que terá um número variável de %stokens, que correspondem ao número de entradas na lista x. Preciso escrever uma string formatada. O seguinte não funciona, mas indica o que estou tentando fazer. Neste exemplo, existem três %stokens e a lista possui três entradas.

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

Eu gostaria que a string de saída fosse:

1 BLAH 2 FOO 3 BAR

Respostas:


112
print s % tuple(x)

ao invés de

print s % (x)

5
(x)é a mesma coisa que x. Colocar um único token entre colchetes não tem significado em Python. Você geralmente coloca colchetes foo = (bar, )para facilitar a leitura, mas foo = bar,faz exatamente a mesma coisa.
patrys

11
print s % (x)é o que OP escreveu, eu estava apenas citando ele / ela.
infravermelho

Eu estava apenas dando uma dica sobre o idioma, não criticando sua resposta (na verdade, eu marquei com +1). Você também não escreveu foo = (bar, ):)
patrys

2
Eu uso a (x)notação para maior clareza; ele também evita esquecer os colchetes se você adicionar variáveis ​​adicionais posteriormente.
SabreWolfy

Que tal se você deseja originar suas variáveis ​​de várias listas? tupla leva apenas uma única lista, e o formatador parece levar apenas uma única tupla
errant.info

150

Você deve dar uma olhada no método de formatação do python. Você poderia então definir sua string de formatação assim:

>>> 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'

1
O problema do OP não é o método, mas o formato dos parâmetros. %operador apenas descompacta tuplas.
patrys

Isso tornaria a construção smais complexa, pois eu precisaria incluir números crescentes em vez de simplesmente %spara cada posição. sé construído em várias etapas diferentes, portanto, é muito mais fácil incluir apenas o %stoken.
SabreWolfy

2
@SabreWolfy Se você construí-lo precedurally então você pode achar que é mais fácil de nomear seus espaços reservados e usar um dicionário para formatar a string resultante: print u'%(blah)d BLAHS %(foo)d FOOS …' % {'blah': 15, 'foo': 4}.
patrys

2
@SabreWolfy: No Python 2.7, você pode omitir os números dos campos:s = '{} BLAH {} BLAH BLAH {} BLAH BLAH BLAH'
Pausado até novo aviso.

Essa resposta é potencialmente confusa, pois faz com que pareça que os valores numéricos de 0, 1 e 2 estão de alguma forma relacionados ao número de vezes que a palavra "BLAH" aparece.
SabreWolfy

31

Seguindo esta página de recursos , se o comprimento de x variar, podemos usar:

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

para criar um marcador de posição para cada elemento da lista x. Aqui está o exemplo:

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]

1
O link agora está morto.
MK Hunter

19

Aqui está um forro. Uma pequena resposta improvisada usando format com print () para iterar uma lista.

Que tal isso (python 3.x):

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

Leia os documentos aqui sobre como usar format () .


18

Como acabei de aprender sobre essa coisa legal (indexação em listas de dentro de uma string de formato), estou adicionando a esta velha questão.

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

Resultado:

1 BLAH 2 FOO 3 BAR

No entanto, ainda não descobri como fazer o fatiamento (dentro da string de formato '"{x[2:4]}".format...) e adoraria descobrir se alguém tiver uma ideia, no entanto, suspeito que você simplesmente não pode fazer isso.


Estou um pouco curioso sobre seu caso de uso para fatiar.
Michael

1
eu realmente não tenho um ... acho que só pensei que seria legal poder fazer
Joran Beasley

11

Esta foi uma pergunta divertida! Outra maneira de lidar com isso para listas de comprimento variável é construir uma função que aproveite ao máximo o .formatmétodo e a descompactação da lista. No exemplo a seguir, não uso nenhuma formatação sofisticada, mas isso pode ser facilmente alterado para atender às suas necessidades.

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'

3

O mesmo que a resposta de @neobot, mas um pouco mais moderno e sucinto.

>>> l = range(5)
>>> " & ".join(["{}"]*len(l)).format(*l)
'0 & 1 & 2 & 3 & 4'

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

A saída é

1 BLAH 2 FOO 3 BAR
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.