2010-11-29 27 views
28

Nếu tôi muốn làm cho chuỗi định dạng của tôi tự động có thể điều chỉnh, tôi sẽ thay đổi mã sau đây từFormat chuỗi động

print '%20s : %20s' % ("Python", "Very Good") 

để

width = 20 
print ('%' + str(width) + 's : %' + str(width) + 's') % ("Python", "Very Good") 

Tuy nhiên, có vẻ như chuỗi nối là cồng kềnh ở đây. Bất kỳ cách nào khác để đơn giản hóa nó?

Trả lời

21

Bạn có thể lấy giá trị đệm khỏi danh sách đối số:

print '%*s : %*s' % (20, "Python", 20, "Very Good") 

Bạn thậm chí có thể chèn các giá trị đệm tự động:

width = 20 
args = ("Python", "Very Good") 
padded_args = zip([width] * len(args), args) 
# Flatten the padded argument list. 
print "%*s : %*s" % tuple([item for list in padded_args for item in list]) 
5
print '%*s : %*s' % (width, 'Python', width, 'Very Good') 
+0

+1 Đây là câu trả lời tốt hơn so với tôi. Tôi đã xem xét các hàm ljust và rjust để làm điều đó. – pyfunc

1

Nếu bạn không muốn xác định chiều rộng cùng một lúc, bạn có thể chuẩn bị chuỗi định dạng trước thời hạn, giống như bạn đang làm - nhưng với sự thay thế khác. Chúng tôi sử dụng %% để thoát khỏi% dấu hiệu thực tế trong chuỗi. Chúng tôi muốn kết thúc với %20s trong chuỗi định dạng của chúng tôi khi chiều rộng là 20, vì vậy chúng tôi sử dụng %%%ds và cung cấp biến chiều rộng để thay thế trong đó. Hai dấu% đầu tiên trở thành một chữ%, và sau đó% d được thay thế bằng biến.

Như vậy:

format_template = '%%%ds : %%%ds' 
# later: 
width = 20 
formatter = format_template % (width, width) 
# even later: 
print formatter % ('Python', 'Very Good') 
+1

Tôi thích điều này như một cách để tạo chuỗi định dạng động nói chung. Tuy nhiên, cách tiếp cận của ông Hamidi là tốt hơn nếu chỉ có chiều rộng trường được tự động nội suy. –

28

Bạn có thể làm điều này bằng cách sử dụng phương pháp str.format().

>>> width = 20 
>>> print("{:>{width}} : {:>{width}}".format("Python", "Very Good", width=width)) 
       Python :   Very Good 

Bắt đầu từ Python 3.6, bạn có thể sử dụng f-string để làm điều này:

In [579]: lang = 'Python' 

In [580]: adj = 'Very Good' 

In [581]: width = 20 

In [582]: f'{lang:>{width}}: {adj:>{width}}' 
Out[582]: '    Python:   Very Good' 
+0

Cảm ơn bạn đã thêm giải pháp f-strings! – Sebastiaan

Các vấn đề liên quan