Eu tenho este código (imprimindo a ocorrência de todas as permutações em uma string)
def splitter(str):
for i in range(1, len(str)):
start = str[0:i]
end = str[i:]
yield (start, end)
for split in splitter(end):
result = [start]
result.extend(split)
yield result
el =[];
string = "abcd"
for b in splitter("abcd"):
el.extend(b);
unique = sorted(set(el));
for prefix in unique:
if prefix != "":
print "value " , prefix , "- num of occurrences = " , string.count(str(prefix));
Quero imprimir todas as ocorrências de permutação que existem em string varaible.
uma vez que a permutação não tem o mesmo comprimento, eu quero fixar a largura e imprimi-la em um bom não como este:
value a - num of occurrences = 1
value ab - num of occurrences = 1
value abc - num of occurrences = 1
value b - num of occurrences = 1
value bc - num of occurrences = 1
value bcd - num of occurrences = 1
value c - num of occurrences = 1
value cd - num of occurrences = 1
value d - num of occurrences = 1
Como posso usar format
para fazer isso?
Eu encontrei essas postagens, mas não combinaram com strings alfanuméricas:
python
python-2.7
format
0x90
fonte
fonte
"\t"
não conste como opção em nenhuma solução.Respostas:
EDIT 2013-12-11 - Essa resposta é muito antiga. Ainda é válido e correto, mas as pessoas olhando para isso devem preferir a nova sintaxe de formato .
Você pode usar a formatação de string como esta:
Basicamente:
%
personagem informa ao python que ele terá que substituir algo por um tokens
caractere informa ao python que o token será uma string5
(ou qualquer número que você desejar) informa ao python para preencher a string com espaços de até 5 caracteres.No seu caso específico, uma possível implementação poderia ser:
NOTA LATERAL: Só queria saber se você tem conhecimento da existência do
itertools
módulo . Por exemplo, você pode obter uma lista de todas as suas combinações em uma linha com:e você pode obter o número de ocorrências usando
combinations
em conjunto comcount()
.fonte
Acho que usar
str.format
muito mais elegante:Se você quiser alinhar a string da maneira certa, use em
>
vez de<
:Edit: Conforme mencionado nos comentários: o 0 indica o índice do argumento passado para
str.format()
.fonte
'{<5}'.format('ss')
'ss '
como antes, mas sem o 0, faz a mesma coisa ou'Second {1: <5} and first {0: <5}'.format('ss', 'sss')
'Second sss and first ss '
então você pode reordenar ou até mesmo gerar a mesma variável muitas vezes em uma única saída corda.{<5}
não funciona, mas{: <5}
funciona sem o valor do índice.{0: <5}
is the[fill]
, the<
is[align]
, and5
is[width]
>>> print width 20 >>> print "{0: <{width}}".format("ssssss", width=width).split('\n') ['ssssss '] >>>
width=10; "{0: <{1}}".format('sss', width)
. Ou mesmo'{: <{}}'.format('sss', width)
Postado originalmente como uma edição na resposta de @ 0x90, mas foi rejeitado por se desviar da intenção original do post e recomendado para postar como um comentário ou resposta, então estou incluindo um pequeno artigo aqui.
Além da resposta de @ 0x90, a sintaxe pode ser mais flexível, usando uma variável para a largura (de acordo com o comentário de @ user2763554):
Além disso, você pode tornar esta expressão mais breve, usando apenas números e contando com a ordem dos argumentos passados para
format
:Ou até mesmo deixar de fora todos os números para compactação máxima, potencialmente não pythonicamente implícita:
Atualização 26/05/2017
Com a introdução de literais de string formatados ("f-strings" para abreviar) no Python 3.6, agora é possível acessar variáveis previamente definidas com uma sintaxe mais breve:
Isso também se aplica à formatação de strings
fonte
format
é definitivamente a maneira mais elegante, mas afaik você não pode usar isso com ologging
módulo python , então aqui está como você pode fazer isso usando a%
formatação:Aqui, o
-
indica o alinhamento à esquerda e o número antess
indica a largura fixa.Alguns exemplos de saída:
Mais informações na documentação aqui: https://docs.python.org/2/library/stdtypes.html#string-formatting-operations
fonte
'%(name)20.20s'
que define 20 como comprimento mínimo e máximo da corda!fonte