Chèn cùng một giá trị nhiều lần khi định dạng một chuỗi


111

Tôi có một chuỗi biểu mẫu này

s='arbit'
string='%s hello world %s hello world %s' %(s,s,s)

Tất cả% s trong chuỗi có cùng giá trị (tức là s). Có cách nào tốt hơn để viết điều này không? (Thay vì liệt kê ra ba lần)



2
Đây %điều hành chuỗi sẽ được "bị phản đối trên Python 3.1 và loại bỏ sau đó tại một thời gian" docs.python.org/release/3.0.1/whatsnew/... bây giờ tôi tự hỏi cách khuyên nhất cho cả hai khả năng tương thích phiên bản và bảo mật là gì.
cregox

2
@Cawas Tôi biết điều này là khá muộn, nhưng tôi thích sử dụng str.format(). Ví dụ:, query = "SELECT * FROM {named_arg}"; query.format(**kwargs)ở đâu querylà chuỗi định dạng và kwargslà một từ điển có các khóa khớp với các named_args trong chuỗi định dạng.
Edwin

4
@Cawas Yeah, trừ Adam sử dụng ký hiệu tuple, nơi {0}, {1}, {2}và vân vân tương ứng với chỉ số tuple 0, 12, tương ứng. Ngoài ra, bạn cũng có thể đặt tên cho các args (như {named_arg}) và đặt mỗi args theo phương thức định dạng, như sau:'Hi {fname} {lname}!'.format(fname='John', lname='Doe')
Edwin

2
@bignose Bạn đã đánh dấu cả hai câu hỏi trùng lặp với nhau, giống như google.com/…
abhi

Câu trả lời:


203

Bạn có thể sử dụng định dạng chuỗi nâng cao , có sẵn trong Python 2.6 và Python 3.x:

incoming = 'arbit'
result = '{0} hello world {0} hello world {0}'.format(incoming)

11
~ sở thích cá nhân của tôi, chọn phong cách result = '{st} hello world {st} hello world {st}'.format(st=incoming)
kwargs

40
incoming = 'arbit'
result = '%(s)s hello world %(s)s hello world %(s)s' % {'s': incoming}

Bạn có thể muốn đọc phần này để hiểu: Các phép toán định dạng chuỗi .


1
Đẹp. Đã quên về điều này. người dân địa phương () cũng sẽ làm như vậy.
Goutham

2
@Goutham: Câu trả lời của Adam Rosenfield có thể tốt hơn nếu bạn là phiên bản Python được cập nhật.
mhawke

Nó thực sự là. Tôi vẫn đang làm quen với các thao tác định dạng chuỗi mới.
Goutham

3
thậm chí tốt hơn, bạn có thể tổng hợp chuỗi cơ sở: '% (s) s hello world' * 3% {'s': 'asdad'}
dalloliogm

15

Bạn có thể sử dụng kiểu định dạng từ điển:

s='arbit'
string='%(key)s hello world %(key)s hello world %(key)s' % {'key': s,}

1
Có vẻ như có rất ít điểm trong việc cung cấp câu trả lời trùng lặp này. Đây là một cái khác: '% (string_goes_here) s hello world% (string_goes_here) s hello world% (string_goes_here) s'% {'string_goes_here': s,}. Thực tế có vô số khả năng.
mhawke

3
mhawke: Tôi đã đăng tin nhắn trước khi trình duyệt của tôi tải lại trang nên tôi không biết rằng câu hỏi đó đã được trả lời ở đâu. Bạn không cần phải là một người đàn ông thô lỗ !!.
Lucas S.

2
@Lucas: Tôi cho rằng có thể bạn đã mất 13 phút để gõ câu trả lời của mình :) và cảm ơn vì đã bỏ phiếu xuống ... đánh giá cao.
mhawke

13

Phụ thuộc vào những gì bạn có nghĩa là tốt hơn. Điều này hoạt động nếu mục tiêu của bạn là loại bỏ phần dư thừa.

s='foo'
string='%s bar baz %s bar baz %s bar baz' % (3*(s,))

3
>>> s1 ='arbit'
>>> s2 = 'hello world '.join( [s]*3 )
>>> print s2
arbit hello world arbit hello world arbit

Tôi đoán rằng ví dụ trong câu hỏi không phải về 'hello world' được lặp lại, mà là một mẫu thực sự không trùng lặp. Đó là lý do tại sao tôi đã phản đối.
Gra

1

Fstrings

Nếu bạn đang sử dụng, Python 3.6+bạn có thể sử dụng cái mới được gọi là f-stringsviết tắt của chuỗi được định dạng và nó có thể được sử dụng bằng cách thêm ký tự fvào đầu chuỗi để xác định đây là chuỗi f .

price = 123
name = "Jerry"
print(f"{name}!!, {price} is much, isn't {price} a lot? {name}!")
>Jerry!!, 123 is much, isn't 123 a lot? Jerry!

Những lợi ích chính của việc sử dụng chuỗi f là chúng dễ đọc hơn, có thể nhanh hơn và cung cấp hiệu suất tốt hơn:

Nguồn gấu trúc cho mọi người: Phân tích dữ liệu Python, bởi Daniel Y. Chen

Điểm chuẩn

Không nghi ngờ gì rằng cái mới f-stringsdễ đọc hơn, vì bạn không phải sửa lại các chuỗi, nhưng nó có nhanh hơn mặc dù như đã nêu trong phần trích dẫn đã nói?

price = 123
name = "Jerry"

def new():
    x = f"{name}!!, {price} is much, isn't {price} a lot? {name}!"


def old():
    x = "{1}!!, {0} is much, isn't {0} a lot? {1}!".format(price, name)

import timeit
print(timeit.timeit('new()', setup='from __main__ import new', number=10**7))
print(timeit.timeit('old()', setup='from __main__ import old', number=10**7))
> 3.8741058271543776  #new
> 5.861819514350163   #old

Chạy thử nghiệm 10 Triệu có vẻ như là thử nghiệm mới f-stringsthực sự nhanh hơn trong việc lập bản đồ.

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.