我需要在字符串中对齐分号。例如:
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]:])
有什么简单的实现方法吗?非常感谢。
像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]
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