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.