Hice un programa de análisis de frecuencia. Devuelve esta tupla ordenada para una determinada cadena:

frequency = [('Z', 110), ('D', 81), ('O', 78), ('V', 69), ('I', 69), ('J', 64), ('C', 58), ('N', 56), ('M', 54), ('Y', 35), ('G', 30), ('P', 27), ('B', 24), ('H', 23), ('X', 23), ('R', 19), ('T', 16), ('W', 15), ('A', 12), ('K', 12), ('F', 8), ('Q', 8), ('E', 2), ('S', 1)]

Entonces quiero imprimir la letra de cifrado y su frecuencia. Además, tengo un alfabeto ordenado por frecuencia de letras en inglés (ordered_alphabet = "ETAOINSRHLDCUMFPGWYBVKXJQZ") Quiero poner cada una de estas letras al lado de mi letra y frecuencia de cifrado para ayudarme a descubrir cuál podría ser la letra de cifrado.

Así que hago:

for item in frequency:
    print("%s : %s \t \t %s" % (item[0], item[1], ordered_alphabet[frequency.index(item)]))

Esto devuelve:

Z : 110          E
D : 81       T
O : 78       A
V : 69       O
I : 69       I
J : 64       N
C : 58       S
N : 56       R
M : 54       H
Y : 35       L
G : 30       D
P : 27       C
B : 24       U
H : 23       M
X : 23       F
R : 19       P
T : 16       G
W : 15       W
A : 12       Y
K : 12       B
F : 8        V
Q : 8        K
E : 2        X
S : 1        J

¿Por qué el primer orden_boletín (E) no está en línea con las otras letras ordenadas? Usé \t para todas ellas.

3
Milan Tom 30 oct. 2017 a las 23:24

3 respuestas

La mejor respuesta

Las tabulaciones no garantizan la alineación, y el ancho de la pestaña depende de la configuración del editor / terminal. En su lugar, puede intentar str.format para corregir los tamaños máximos de campo y soltarlos mediante tabulaciones. Use solo espacios para el formato determinista.

Por ejemplo (codifiqué 3 como el tamaño, pero es posible que desee calcular previamente el tamaño máximo):

print("{} : {:3}   {}" .format (item[0], item[1], ordered_alphabet[frequency.index(item)]))

Sin codificación y cálculo de tamaño máximo:

maxdigit = len(str(max(x[1] for x in frequency)))
for item in frequency:
    print("{} : {:{}}   {}" .format (item[0], item[1], maxdigit, ordered_alphabet[frequency.index(item)]))

Me atrapa

Z : 110   E
D :  81   T
O :  78   A
V :  69   O
I :  69   I
J :  64   N
C :  58   S
N :  56   R
M :  54   H
Y :  35   L
G :  30   D
P :  27   C
B :  24   U
H :  23   M
X :  23   F
R :  19   P
T :  16   G
W :  15   W
A :  12   Y
K :  12   B
F :   8   V
Q :   8   K
E :   2   X
S :   1   J
3
Jean-François Fabre 30 oct. 2017 a las 20:34

Agregue un poco de espacio a su segundo formato de cadena (%s) y debería alinear todo lo demás después de él

frequency = [('Z', 110), ('D', 81), ('O', 78), ('V', 69), ('I', 69), ('J', 64), ('C', 58), ('N', 56), ('M', 54), ('Y', 35), ('G', 30), ('P', 27), ('B', 24), ('H', 23), ('X', 23), ('R', 19), ('T', 16), ('W', 15), ('A', 12), ('K', 12), ('F', 8), ('Q', 8), ('E', 2), ('S', 1)]
for item in frequency:
    print("%s : %-5s \t %s" % (item[0], item[1], ordered_alphabet[frequency.index(item)]))

Z : 110    E
D : 81     T
O : 78     A
V : 69     O
I : 69     I
J : 64     N
.... 
3
AK47 30 oct. 2017 a las 20:27

Básicamente necesitas algo de relleno para el segundo campo.

Cambie print("%s : %s a print("%s : %3s: 3 aquí dice: Rellene el campo con espacios de hasta 3 caracteres

Enlace: https://repl.it/N2tX

Salida:

Z : 110          E
D :  81          T
O :  78          A
V :  69          O
I :  69          I
J :  64          N
C :  58          S
N :  56          R
M :  54          H
Y :  35          L
G :  30          D
P :  27          C
B :  24          U
H :  23          M
X :  23          F
R :  19          P
T :  16          G
W :  15          W
A :  12          Y
K :  12          B
F :   8          V
Q :   8          K
E :   2          X
S :   1          J
1
Rahul Verma 30 oct. 2017 a las 20:34