2011-09-27 34 views
61

Tôi tạo một chuỗi s trong Python 2.6.5, mã này sẽ có số lượng khác nhau của %s mã thông báo, khớp với số lượng mục nhập trong danh sách x. Tôi cần phải viết ra một chuỗi định dạng. Sau đây không hoạt động, nhưng chỉ ra những gì tôi đang cố gắng làm. Trong ví dụ này, có ba mã thông báo %s và danh sách có ba mục nhập.Sử dụng Định dạng Chuỗi Python với Danh sách

s = '%s BLAH %s FOO %s BAR' 
x = ['1', '2', '3'] 
print s % (x) 

Tôi muốn chuỗi đầu ra là:

1 BLAH 2 FOO 3 BAR

Trả lời

17

Sau resource page này, nếu chiều dài của x là khác nhau, chúng ta có thể sử dụng:

', '.join(['%.2f']*len(x)) 

để tạo ra một giữ chỗ cho mỗi phần tử từ liệt kê x. Dưới đây là ví dụ:

x = [1/3.0, 1/6.0, 0.678] 
s = ("elements in the list are ["+', '.join(['%.2f']*len(x))+"]") % tuple(x) 
print s 
>>> elements in the list are [0.33, 0.17, 0.68] 
74
print s % tuple(x) 

thay vì

print s % (x) 
+2

'(x)' giống với 'x'. Đặt một mã thông báo trong dấu ngoặc đơn không có ý nghĩa trong Python. Bạn thường đặt các dấu ngoặc trong 'foo = (bar,)' để làm cho nó dễ đọc hơn nhưng 'foo = bar,' thực hiện chính xác điều tương tự. – patrys

+6

'in s% (x)' là những gì OP đã viết, tôi chỉ trích dẫn anh ta/cô ấy. – infrared

+0

Tôi chỉ cung cấp một mẹo ngôn ngữ, không chỉ trích câu trả lời của bạn (trên thực tế tôi đã +1 nó).Bạn đã không viết 'foo = (bar,)' hoặc là :) – patrys

99

Bạn nên có một cái nhìn vào phương thức format của python. Sau đó bạn có thể định nghĩa chuỗi định dạng của bạn như thế này:

>>> s = '{0} BLAH {1} BLAH BLAH {2} BLAH BLAH BLAH' 
>>> x = ['1', '2', '3'] 
>>> print s.format(*x) 
'1 BLAH 2 BLAH BLAH 3 BLAH BLAH BLAH' 
+0

Python 2.6+ only. – agf

+1

OP sử dụng 2.6.5 -> ok – glglgl

+1

Vấn đề của OP không phải là phương pháp mà là định dạng của các tham số. Toán tử '%' chỉ giải nén các bộ dữ liệu. – patrys

11

Vì tôi vừa mới tìm hiểu về điều tuyệt vời này (thêm vào danh sách từ trong chuỗi định dạng), tôi đang thêm vào câu hỏi cũ này.

s = '{x[0]} BLAH {x[1]} FOO {x[2]} BAR' 
x = ['1', '2', '3'] 
print s.format (x=x) 

Tuy nhiên, tôi vẫn chưa tìm ra cách để làm cắt (bên trong chuỗi định dạng '"{x[2:4]}".format...,) và rất thích con số nó ra nếu có ai có một ý tưởng, tuy nhiên tôi nghi ngờ rằng bạn chỉ đơn giản là không thể làm được cái đó.

+0

Tôi hơi tò mò về trường hợp sử dụng của bạn để cắt. – Michael

+0

tôi không thực sự có một ... tôi nghĩ rằng tôi chỉ nghĩ rằng nó sẽ được gọn gàng để có thể làm –

4

Đây là một câu hỏi thú vị! Một cách khác để xử lý điều này bằng phương thức .format cho các danh sách độ dài thay đổi là sử dụng một hàm tận dụng toàn bộ danh sách giải nén. Trong ví dụ sau, tôi không sử dụng bất kỳ định dạng ưa thích nào, nhưng có thể dễ dàng thay đổi cho phù hợp với nhu cầu của bạn.

list_1 = [1,2,3,4,5,6] 
list_2 = [1,2,3,4,5,6,7,8] 

# Create a function to easily repeat on many lists: 
def ListToFormattedString(alist): 
    # Each item is right-adjusted, width=3 
    formatted_list = ['{:>3}' for item in alist] 
    s = ','.join(formatted_list) 
    return s.format(*alist) 

# Example output: 
>>>ListToFormattedString(list_1) 
' 1, 2, 3, 4, 5, 6' 
>>>ListToFormattedString(list_2) 
' 1, 2, 3, 4, 5, 6, 7, 8' 
-1

và cũng có thể trong python 3.6+ làm:

x = ['1', '2', '3'] 
print(f"{x[0]} BLAH {x[1]} FOO {x[2]} BAR") 
0

Dưới đây là một câu trả lời ứng khẩu ít để sử dụng định dạng với print() trên một danh sách.

Làm thế nào về điều này: (py3)

sample_list = ['cat', 'dog', 'bunny', 'pig'] 
print("Your list of animals are: {}, {}, {} and {}".format(*sample_list)) 

Đọc các tài liệu ở đây về việc sử dụng format.

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