Sử dụng định dạng chuỗi Python với danh sách


112

Tôi tạo một chuỗi sbằng Python 2.6.5 sẽ có số lượng %smã thông báo khác nhau , phù hợp với số mục nhập trong danh sách x. Tôi cần viết ra một chuỗi được định dạng. Phần sau không hoạt động, nhưng chỉ ra những gì tôi đang cố gắng thực hiện. Trong ví dụ này, có ba %smã thông báo và danh sách có ba mục nhập.

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

Câu trả lời:


112
print s % tuple(x)

thay vì

print s % (x)

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

11
print s % (x)là những gì OP đã viết, tôi chỉ trích dẫn anh ấy / cô ấy.
hồng ngoại

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 (thực tế là tôi đã +1 nó). Bạn cũng không viết foo = (bar, ):)
patrys

2
Tôi sử dụng (x)ký hiệu cho rõ ràng; nó cũng tránh quên dấu ngoặc nếu sau này bạn thêm các biến bổ sung.
SabreWolfy

Còn nếu bạn muốn nguồn các biến của mình từ nhiều danh sách thì sao? tuple chỉ mất một danh sách duy nhất, và các định dạng dường như chỉ mất một tuple đơn
errant.info

150

Bạn nên xem phương pháp định dạng của python. Sau đó, bạn có thể xác định chuỗi định dạng của mình như sau:

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

1
Vấn đề của OP không phải là phương thức mà là định dạng của các tham số. %nhà điều hành chỉ giải nén các bộ giá trị.
patrys

Điều này sẽ làm cho việc xây dựng sphức tạp hơn, vì tôi sẽ cần bao gồm các số tăng dần thay vì chỉ đơn giản %scho mỗi vị trí. sđược xây dựng theo một số bước khác nhau, vì vậy sẽ dễ dàng hơn nhiều nếu chỉ bao gồm %smã thông báo.
SabreWolfy

2
@SabreWolfy Nếu bạn xây dựng nó precedurally sau đó bạn có thể tìm thấy nó dễ dàng hơn để đặt tên placeholders của bạn và sử dụng một dict để định dạng chuỗi kết quả: print u'%(blah)d BLAHS %(foo)d FOOS …' % {'blah': 15, 'foo': 4}.
patrys

2
@SabreWolfy: Trong Python 2.7, bạn có thể bỏ qua số trường:s = '{} BLAH {} BLAH BLAH {} BLAH BLAH BLAH'
tạm dừng cho đến khi có thông báo mới.

Câu trả lời này có khả năng gây nhầm lẫn, vì nó làm cho nó giống như các giá trị số 0, 1 và 2 có liên quan đến số lần từ "BLAH" xuất hiện.
SabreWolfy

31

Theo dõi trang tài nguyên này , nếu độ dài của x thay đổi, chúng ta có thể sử dụng:

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

để tạo phần giữ chỗ cho mỗi phần tử từ danh sách x. Đâ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]

1
Liên kết hiện đã chết.
MK Hunter

19

Đây là một lớp lót. Một câu trả lời ngẫu hứng nhỏ sử dụng định dạng với print () để lặp lại danh sách.

Làm thế nào về điều này (python 3.x):

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

Đọc tài liệu ở đây bằng cách sử dụng định dạng () .


18

Vì tôi vừa mới biết về điều thú vị này (lập chỉ mục vào danh sách từ bên 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))

Đầu ra:

1 BLAH 2 FOO 3 BAR

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


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

1
i dont thực sự có một ... tôi nghĩ rằng tôi chỉ nghĩ nó sẽ là gọn gàng để có thể làm
Joran Beasley

11

Đây là một câu hỏi thú vị! Một cách khác để xử lý điều này đối với danh sách có độ dài thay đổi là xây dựng một hàm tận dụng tối đa .formatphương pháp và giải nén danh sách. 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 để 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 that can apply formatting to lists of any length:
def ListToFormattedString(alist):
    # Create a format spec for each item in the input `alist`.
    # E.g., each item will be right-adjusted, field width=3.
    format_list = ['{:>3}' for item in alist] 

    # Now join the format specs into a single string:
    # E.g., '{:>3}, {:>3}, {:>3}' if the input list has 3 items.
    s = ','.join(format_list)

    # Now unpack the input list `alist` into the format string. Done!
    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'

3

Giống như câu trả lời của @ neobot nhưng hiện đại và ngắn gọn hơn một chút.

>>> l = range(5)
>>> " & ".join(["{}"]*len(l)).format(*l)
'0 & 1 & 2 & 3 & 4'

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

Đầu ra là

1 BLAH 2 FOO 3 BAR
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.