Eu sou bastante novo no Python e agora estou lutando com a formatação de meus dados para a saída impressa.
Eu tenho uma lista que é usada para dois títulos e uma matriz que deve ser o conteúdo da tabela. Igual a:
teams_list = ["Man Utd", "Man City", "T Hotspur"]
data = np.array([[1, 2, 1],
[0, 1, 0],
[2, 4, 2]])
Observe que os nomes dos cabeçalhos não são necessariamente do mesmo comprimento. As entradas de dados são todas inteiras, no entanto.
Agora, eu quero representar isso em um formato de tabela, algo como isto:
Man Utd Man City T Hotspur
Man Utd 1 0 0
Man City 1 1 0
T Hotspur 0 1 2
Tenho um palpite de que deve haver uma estrutura de dados para isso, mas não consigo encontrá-la. Tentei usar um dicionário e formatar a impressão, tentei loops com recuo e tentei imprimir como strings.
Estou certo de que deve haver uma maneira muito simples de fazer isso, mas provavelmente estou sentindo falta disso por falta de experiência.
Respostas:
Algum código ad-hoc para Python 2.7:
Isso depende
str.format()
e o Mini-idioma de especificação de formato .fonte
Existem alguns pacotes python leves e úteis para esse fim:
1. tabule : https://pypi.python.org/pypi/tabulate
tabular tem muitas opções para especificar cabeçalhos e formato de tabela.
2. PrettyTable : https://pypi.python.org/pypi/PrettyTable
PrettyTable tem opções para ler dados do banco de dados csv, html e sql. Também é possível selecionar subconjunto de dados, classificar tabela e alterar estilos de tabela.
3. tabela de texto : https://pypi.python.org/pypi/texttable
Com a tabela de texto, você pode controlar o alinhamento horizontal / vertical, o estilo da borda e os tipos de dados.
4. termtables : https://github.com/nschloe/termtables
Com a tabela de texto, você pode controlar o alinhamento horizontal / vertical, o estilo da borda e os tipos de dados.
Outras opções:
fonte
coalign
palavra-chave de alinhamento de coluna não é suportada na versão oficial do pypi. "tableprint" - média, complexo da API, exemplos de uso comuns insuficientes.fonte
pip install numpy
usa rodas binárias agora na maioria das plataformas (sem compilação) . Obviamente, outras opções de instalação binária estavam disponíveis mesmo antes disso.O Python realmente facilita isso.
Algo como
terá a saída
O% dentro da string é essencialmente um caractere de escape e os caracteres a seguir informam ao python que tipo de formato os dados devem ter. O% outside e after a string está dizendo ao python que você pretende usar a string anterior como a string de formato e que os seguintes dados devem ser colocados no formato especificado.
Nesse caso, usei "% -12i" duas vezes. Para dividir cada parte:
Dos documentos: https://docs.python.org/2/library/stdtypes.html#string-formatting
fonte
print('%-20.2f' % position['deg'], '%-17.2f' % position['v2'])
onde.2
especifica a precisão do flutuadorf
Atualizando a resposta de Sven Marnach para trabalhar em Python 3.4:
fonte
Quando faço isso, gosto de ter algum controle sobre os detalhes de como a tabela é formatada. Em particular, quero que as células de cabeçalho tenham um formato diferente das células do corpo, e as larguras das colunas da tabela sejam tão largas quanto cada uma precisa. Aqui está a minha solução:
Aqui está a saída:
fonte
Eu acho que é isso que você está procurando.
É um módulo simples que apenas calcula a largura máxima necessária para as entradas da tabela e depois usa apenas rjust e ljust para fazer uma boa impressão dos dados.
Se você deseja que o cabeçalho esquerdo fique alinhado à direita, basta alterar esta chamada:
Da linha 53 com:
fonte
Sei que estou atrasado para a festa, mas acabei de criar uma biblioteca para isso que acho que poderia realmente ajudar. É extremamente simples, é por isso que acho que você deveria usá-lo. É chamado TableIT .
Uso básico
Para usá-lo, primeiro siga as instruções de download na página do GitHub .
Em seguida, importe-o:
Em seguida, faça uma lista de listas em que cada lista interna é uma linha:
Então tudo que você precisa fazer é imprimi-lo:
Esta é a saída que você obtém:
Nomes dos campos
Você pode usar nomes de campos se desejar ( se não estiver usando nomes de campos, não precisará dizer useFieldNames = False porque está definido como padrão por padrão ):
A partir disso, você obterá:
Existem outros usos para, por exemplo, você pode fazer isso:
A partir desse:
Ou você pode fazer:
E a partir disso você obtém:
Cores
Você também pode usar cores.
Você usa cores usando a opção de cor ( por padrão, é definida como Nenhuma ) e especificando valores RGB.
Usando o exemplo acima:
Então você receberá:
Observe que as cores de impressão podem não funcionar para você, mas funcionam exatamente da mesma forma que as outras bibliotecas que imprimem texto colorido. Eu testei e todas as cores funcionam. O azul também não está bagunçado, como seria se estivesse usando a
34m
sequência de escape ANSI padrão (se você não souber o que é isso, não importa). Enfim, tudo vem do fato de que todas as cores têm valor RGB e não o padrão do sistema.Mais informações
Para mais informações, consulte a página do GitHub
fonte
Pure Python 3
Vai imprimir
fonte
Uma maneira simples de fazer isso é fazer um loop sobre todas as colunas, medir sua largura, criar um modelo de linha para essa largura máxima e imprimir as linhas. Não é exatamente o que você está procurando , porque nesse caso, primeiro você precisa colocar seus cabeçalhos dentro da mesa, mas acho que pode ser útil para outra pessoa.
Você usa assim:
fonte
A função a seguir criará a tabela solicitada (com ou sem numpy) com o Python 3 (talvez também o Python 2). Eu escolhi definir a largura de cada coluna para corresponder à do nome da equipe mais longo. Você pode modificá-lo se quiser usar o comprimento do nome da equipe para cada coluna, mas será mais complicado.
Nota: Para um equivalente direto no Python 2, você poderia substituir o
zip
comizip
de itertools.Isso produzirá a seguinte tabela:
Se você deseja ter separadores de linhas verticais, é possível substituir
" ".join
por" | ".join
.Referências:
fonte
Eu tentaria percorrer a lista e usar um formatador CSV para representar os dados que você deseja.
Você pode especificar guias, vírgulas ou qualquer outro caractere como delimitador.
Caso contrário, basta percorrer a lista e imprimir "\ t" após cada elemento
http://docs.python.org/library/csv.html
fonte
Achei isso apenas procurando uma maneira de gerar colunas simples. Se você apenas precisar de colunas sem complicações , poderá usar o seguinte:
Edição: Eu estava tentando ser o mais simples possível e, assim, fiz algumas coisas manualmente, em vez de usar a lista de equipes. Para generalizar a pergunta real do OP:
Ouputs:
Mas isso não parece mais simples do que as outras respostas, talvez com o benefício de não exigir mais importações. Mas a resposta da @ campkeith já cumpriu isso e é mais robusta, pois pode lidar com uma variedade maior de comprimentos de etiquetas.
fonte