【问题标题】:Why is the first tab (\t) not in line with the others?为什么第一个制表符 (\t) 与其他制表符不一致?
【发布时间】:2017-10-30 20:24:20
【问题描述】:

我做了一个频率分析程序。它为某个字符串返回这个排序的元组:

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)]

所以我想打印密码字母及其频率。另外,我有一个按英文字母频率排序的字母表(ordered_alphabet = "ETAOINSRHLDCUMFPGWYBVKXJQZ")我想把这些字母中的每一个放在我的密码字母和频率旁边,以帮助我弄清楚密码字母可能是什么。

所以我这样做:

for item in frequency:
    print("%s : %s \t \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
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

为什么第一个ordered_letter(E) 与其他有序字母不一致?我都用\t

【问题讨论】:

  • 因为110比81长?
  • 那为什么V 12 比 8 还长呢? @jonrsharpe
  • 因为这不会把你推到一个制表位上。

标签: python string python-3.x tabs


【解决方案1】:

制表不保证对齐,制表宽度取决于编辑器/终端设置。您可以尝试str.format 来修复最大字段大小并使用表格删除。仅使用空格进行确定性格式设置。

例如(我将 3 硬编码为大小,但您可能需要预先计算最大大小):

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

无需编码和最大尺寸计算:

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)]))

了解我

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

【讨论】:

  • 大括号代替了什么? @Jean-FrançoisFabre
  • 而不是硬编码 3 可能想建议 OP 找到最大的数字:D 其他明智的,就像总是好的答案
  • @MooingRawr 这是真的!
  • @MilanTom 括号用于在 str.format 上读取占位符,这是一个有用的功能。
【解决方案2】:

为您的第二个字符串格式(%s)添加一些间距,它应该对齐它之后的所有其他内容

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】:

    第二个字段基本上需要一些填充。

    print("%s : %s 更改为print("%s : %3s3 这里说:用最多3 个字符的空格填充字段

    链接:https://repl.it/N2tX

    输出:

    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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-08-04
      • 2011-02-06
      • 1970-01-01
      • 1970-01-01
      • 2020-01-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多