2017-01-27 18 views
10

Nói rằng tôi có một hàmLàm cách nào để nội suy một danh sách thành một chuỗi f trong Python?

def foo(): return [1, 2, 3] 

Tôi muốn suy kết quả của hàm thành chuỗi để có được "001 002 003". Tôi đã thử điều này:

f"{*foo():03d 03d 03d}" 

Nhưng nó đã sản xuất SyntaxError: can't use starred expression here. Tôi có thể làm điều này bằng cách sử dụng một chuỗi ký tự không?

+2

'f "{'' .join (bản đồ ('{: 03D}' .format, foo()))} "'? –

+0

Đề xuất hoạt động, nhưng chuỗi f là thừa và cú pháp chi tiết. Người ta chỉ có thể sử dụng câu trả lời tương tự của @ ev-kounis, không có chuỗi f. Có vẻ như các chuỗi f không cải thiện việc in danh sách. – divenex

Trả lời

8

là những gì bạn đang tìm kiếm?

str_repr = ' '.join(map('{:03d}'.format, foo())) 
print(str_repr) # prints: 001 002 003 

có thể điều tốt nhất về giải pháp này là nó hoạt động với bất kỳ độ dài danh sách và điều chỉnh tối thiểu bạn cũng có thể thay đổi định dạng đầu ra.

+0

Tính năng này hoạt động nhưng không ** thực hiện việc sử dụng các chuỗi f theo yêu cầu. Nó thực sự có thể là giải pháp Python có sẵn tốt nhất, nhưng nó là tiết. Tôi muốn một cái gì đó như thế này 'f '{foo(): 03d}" 'sẽ chủ đề trong danh sách. – divenex

3

Thứ nhất, * -operator chỉ có thể giải nén các vòng lặp trong một số ngữ cảnh cụ thể, chẳng hạn như gọi hàm, hiển thị danh sách, v.v. Không thể sử dụng trực tiếp trong trình giữ chỗ chuỗi. Mặc dù, bạn có thể sử dụng str.format() như thế này:

"{:03d} {:03d} {:03d}".format(*foo()) 

Thứ hai, bạn thường không thể định dạng/nội suy nhiều giá trị trong một trình giữ chỗ. Bạn sẽ cần phải sử dụng một trình giữ chỗ riêng biệt cho mỗi giá trị:

lst = foo() 
f"{lst[0]:03d} {lst[1]:03d} {lst[2]:03d}" 
+0

"các * -operator chỉ có thể giải nén iterables trong một cuộc gọi chức năng" Đó là không đúng: '[1, 3, * foo()]' hoạt động. – L3viathan

+0

* "bạn không thể định dạng/nội suy nhiều giá trị trong một trình giữ chỗ duy nhất" * không phải là nếu bạn sử dụng 'map' và' {} .format' làm hàm –

+0

@ L3viathan: điểm tốt, được cập nhật. –

1

Nhà điều hành * (quy tắc tương tự tồn tại cho **) chỉ có thể được sử dụng bên trong:

  • một cuộc gọi chức năng: foo(*bar)
  • danh sách, bộ hoặc được đặt theo nghĩa đen: ['foo', *bar]
  • bài tập: foo, *bar = range(10)

Nó không phải là một expression và do đó có thể không được sử dụng bên trong niềng răng của f-strings.

0

Đối với danh sách, các chuỗi có vẻ không thêm nhiều vào những gì đã có sẵn mà không có chúng. Một thay thế, hơi đơn giản, giải pháp mà không f-dây và không .join, mà làm việc cho bất kỳ độ dài danh sách, như sau

a = foo() 
str_repr = ("{:03d} "*len(a)).format(*a) 
print(str_repr) # prints: 001 002 003 
Các vấn đề liên quan