Làm thế nào để in một danh sách "đúng cách"?


95

Vì vậy, tôi có một danh sách:

['x', 3, 'b']

Và tôi muốn đầu ra là:

[x, 3, b]

Làm thế nào tôi có thể làm điều này trong python?

Nếu tôi làm vậy str(['x', 3, 'b']), tôi nhận được một cái có dấu ngoặc kép, nhưng tôi không muốn dấu ngoặc kép.


Để giải thích lý do tại sao danh sách không được in "đúng cách", print(["Sam"])các lệnh gọi repr("Sam")trả về 'Sam'(có dấu ngoặc kép), không giống như khi bạn gọi print("Sam")và lệnh gọi python str("Sam")trả về Sam(không có dấu ngoặc kép). Xem sự khác biệt giữa strrepr hoặc Python strlists để biết thêm thông tin.
Ẩn danh

Câu trả lời:


188

Trong Python 2:

mylist = ['x', 3, 'b']
print '[%s]' % ', '.join(map(str, mylist))

Trong Python 3 (đâu printlà một hàm nội trang và không phải là một tính năng cú pháp nữa):

mylist = ['x', 3, 'b']
print('[%s]' % ', '.join(map(str, mylist)))

Cả hai đều trở lại:

[x, 3, b]

Đây là cách sử dụng map()hàm để gọi str cho mỗi phần tử của danh sách mylist , tạo một danh sách các chuỗi mới sau đó được nối thành một chuỗi với str.join(). Sau đó, %toán tử định dạng chuỗi thay thế chuỗi trong thay vì %strong "[%s]".


4
Cảm ơn bạn rằng công việc tuyệt vời. Bạn có thể giải thích chi tiết một chút về những gì bạn đang làm trong dòng thứ hai? Tôi mới làm quen với python.
Obaid

19
Anh ta đang sử dụng maphàm để gọi strcho từng phần tử mylist, tạo một danh sách các chuỗi mới mà anh ta sau đó nối thành một chuỗi với str.join. Sau đó, anh ta sử dụng %toán tử định dạng chuỗi để thay thế chuỗi trong thay vì %strong "[%s]".
li.davidm

6
Một cách khác để làm điều đó đó là có thể hiện đại hơn một chút: "[{0}]".format(", ".join(str(i) for i in mylist))
Jack O'Connor

2
tôi có xu hướng thích map(f, xs)(hoặc imaptrong python2.x) hơn (f(x) for x in xs), khi nào flà một cuộc gọi được xác định trước; có xu hướng thực thi ít mã byte hơn và thường nhỏ gọn hơn. Chắc chắn điều đó không map(lambda x:..., xs) tệ hơn nhiều so với(... for x in xs)
SingleNegationElimination

1
@ user1767754: vậy hả? Liên kết?
SingleNegationElimination

18

Đây là mã đơn giản, vì vậy nếu bạn là người mới, bạn nên hiểu nó một cách dễ dàng.

    mylist = ["x", 3, "b"]
    for items in mylist:
        print(items)

Nó in tất cả chúng mà không có dấu ngoặc kép, như bạn muốn.


15

Chỉ sử dụng bản in:

>>> l = ['x', 3, 'b']
>>> print(*l, sep='\n')
x
3
b
>>> print(*l, sep=', ')
x, 3, b


9

Thay vì sử dụng map, tôi khuyên bạn nên sử dụng biểu thức trình tạo với khả năng joinchấp nhận trình lặp:

def get_nice_string(list_or_iterator):
    return "[" + ", ".join( str(x) for x in list_or_iterator) + "]"

Đây, joinlà một hàm thành viên của lớp chuỗi str. Nó nhận một đối số: một danh sách (hoặc trình lặp) các chuỗi, sau đó trả về một chuỗi mới với tất cả các phần tử được nối bởi, trong trường hợp này ,,.


2
Một tối ưu hóa tốt cho Python 2, vì bản đồ trả về một danh sách trong 2.x. Nó trả về một trình tạo trong 3.x, vì vậy nó không giúp được gì nhiều ở đó.
Tom Zych

7
Tôi sẽ quay trở lại", ".join( str(x) for x in list_or_iterator).join('[]')
eyquem

@eyquem: Thông minh, tôi chưa thấy tham gia nào được sử dụng như vậy trước đây. Tuy nhiên, điều đó hơi khó hiểu đối với người mới bắt đầu (vì bạn đang sử dụng thuộc tính chuỗi là một vùng chứa có thể lặp lại của các chuỗi một ký tự).
Seth Johnson

6

Bạn có thể xóa tất cả các ký tự không mong muốn từ một chuỗi sử dụng của nó translate()phương pháp với Noneđối với tablelập luận theo sau là một chuỗi chứa ký tự (s) mà bạn muốn xóa do của nó deletecharsđối số.

lst = ['x', 3, 'b']

print str(lst).translate(None, "'")

# [x, 3, b]

Nếu bạn đang sử dụng phiên bản Python trước 2.6, bạn sẽ cần sử dụng chức năng stringcủa mô-đun translate()thay vì khả năng truyền Nonelàm tableđối số không được thêm vào cho đến khi Python 2.6. Sử dụng nó trông như thế này:

import string

print string.translate(str(lst), None, "'")

Sử dụng string.translate()hàm cũng sẽ hoạt động trong 2.6+, vì vậy việc sử dụng nó có thể thích hợp hơn.


2
Than ôi: lst = ["it isn't", 3, 'b']==> ["it isnt", 3, b]và cũng vớilst = ['it isn\'t', 3, 'b']
Eyquem

1
@eyquem: Có, việc tránh xóa các ký tự thực sự là một phần trong dữ liệu của bạn (chứ không phải dùng để phân định rõ ràng) đương nhiên sẽ yêu cầu logic phức tạp hơn / khác một chút nếu có thể.
martineau

3

Đây là một phiên tương tác hiển thị một số bước trong một lớp lót của @ TokenMacGuy. Đầu tiên, anh ta sử dụng maphàm để chuyển đổi từng mục trong danh sách thành một chuỗi (thực ra, anh ta đang tạo một danh sách mới, không chuyển đổi các mục trong danh sách cũ). Sau đó, anh ấy đang sử dụng phương thức chuỗi joinđể kết hợp các chuỗi đó với ', 'giữa chúng. Phần còn lại chỉ là định dạng chuỗi, khá đơn giản. (Chỉnh sửa: trường hợp này rất đơn giản; định dạng chuỗi nói chung có thể hơi phức tạp.)

Lưu ý rằng việc sử dụng joinlà một cách đơn giản và hiệu quả để xây dựng một chuỗi từ một số chuỗi con, hiệu quả hơn nhiều so với việc thực hiện bằng cách thêm chuỗi liên tiếp vào chuỗi, liên quan đến việc sao chép nhiều phía sau.

>>> mylist = ['x', 3, 'b']
>>> m = map(str, mylist)
>>> m
['x', '3', 'b']
>>> j = ', '.join(m)
>>> j
'x, 3, b'

2

Sử dụng .formatđể định dạng chuỗi,

mylist = ['x', 3, 'b']
print("[{0}]".format(', '.join(map(str, mylist))))

Đầu ra:

[x, 3, b]

Giải trình:

  1. mapđược sử dụng để ánh xạ từng phần tử của danh sách cần stringnhập.
  2. Các phần tử được nối với nhau thành một chuỗi với ,dấu phân tách.
  3. Chúng tôi sử dụng []trong câu lệnh in để hiển thị các dấu ngoặc nhọn trong danh sách.

Tham khảo: .formatđể định dạng chuỗi PEP-3101


Tuyệt quá! Tôi tìm cách sử dụng .formatcon trăn nhất. Nhưng, tất nhiên, tôi chấp nhận những bất đồng. ;)
yêu thích. Theo.Jesus

0

Tôi đã lấy cảm hứng từ @AniMenon để viết một giải pháp tổng quát hơn cho trăn.

mylist = ['x', 3, 'b']
print('[{}]'.format(', '.join(map('{}'.format, mylist))))

Nó chỉ sử dụng formatphương pháp. Không có dấu vết strvà nó cho phép tinh chỉnh định dạng phần tử. Ví dụ: nếu bạn có số thực dưới dạng phần tử của danh sách, bạn có thể điều chỉnh định dạng của chúng, bằng cách thêm từ định nghĩa chuyển đổi, trong trường hợp này:.2f

mylist = [1.8493849, -6.329323, 4000.21222111]
print("[{}]".format(', '.join(map('{:.2f}'.format, mylist))))

Đầu ra là khá tốt:

[1.85, -6.33, 4000.21]
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.