как просто выровнять точку с запятой по строкам в Python?

#python

#python

Вопрос:

Мне нужно выровнять точку с запятой в строках. Например:

 Input:
  1-1: abc
  1-2-1: defghi
  1-2-1a: jklmnopqr
  1-2-1a-1-1-1a: stuvwxyz

Ouput:
  1-1          : abc
  1-2-1        : defghi
  1-2-1a       : jklmnopqr
  1-2-1a-1-1-1a: stuvwxyz
 

И вот мое решение.

 strs = ['1-1: abc', '2-2-2: defghi', '3-3-3b: jklmnopqr', '1-2-1a-1-1-1a: stuvwxyz']
lengths = [s.find(':') for s in strs]
for i, s in enumerate(strs):
  if lengths[i] == -1:
    new_strs.append(s)
  else:
    new_strs.append(s[:lengths[i]]   ' ' * (max(lengths) - lengths[i])   s[lengths[i]:])
 

Есть ли какой-нибудь простой способ реализации? Спасибо.

Ответ №1:

Такие функции, как ljust и rjust являются вашими друзьями при попытке выровнять вывод:

 >>> aligned = [f"{s.split(':')[0].ljust(max(s.index(':') for s in strs))}:{s.split(':')[1]}" for s in strs]
>>> print("n".join(aligned))
1-1          : abc
2-2-2        : defghi
3-3-3b       : jklmnopqr
1-2-1a-1-1-1a: stuvwxyz
 

или немного менее компактно:

 >>> i = max(s.index(":") for s in strs)
>>> cols = [s.split(":") for s in strs]
>>> aligned = [f"{c[0].ljust(i)}:{c[1]}" for c in cols]
 

Ответ №2:

Python f-строки позволяют ссылаться на переменные в текущем пространстве имен. Кроме того, его спецификация формата также позволяет дескрипторам полей также поступать из переменных. После разделения двух частей строки найдите самое длинное значение слева от двоеточия, и у вас будет заполнение для всех них.

 >>> strs = ['1-1: abc', '2-2-2: defghi', '3-3-3b: jklmnopqr', '1-2-1a-1-1-1a: stuvwxyz']
>>> parts = [s.split(":", 1) for s in strs]
>>> field_len = max(len(p[0]) for p in parts)
>>> for p0, p1 in parts:
...     print(f"{p0:<{field_len}s}: {p1}")
... 
1-1          :  abc
2-2-2        :  defghi
3-3-3b       :  jklmnopqr
1-2-1a-1-1-1a:  stuvwxyz