In mà không có dòng mới (in 'a',) in một khoảng trắng, làm thế nào để loại bỏ?


124

Tôi có mã này:

>>> for i in xrange(20):
...     print 'a',
... 
a a a a a a a a a a a a a a a a a a a a

Tôi muốn đầu ra 'a', mà không ' 'như thế này:

aaaaaaaaaaaaaaaaaaaa

Có thể không?


4
Tôi ngạc nhiên khi chưa có ai nhắc đến "".join("a" for i in xrange(20)). (Nó linh hoạt hơn nhiều so với chỉ làm "a" * 20, vì tôi cho rằng đó là một ví dụ đơn giản).
Thomas K

Câu trả lời:


131

Có một số cách để đạt được kết quả của bạn. Nếu bạn chỉ muốn một giải pháp cho trường hợp của mình, hãy sử dụng phép nhân chuỗi như @Ant đề cập. Điều này chỉ hoạt động nếu mỗi printcâu lệnh của bạn in cùng một chuỗi. Lưu ý rằng nó hoạt động để nhân bất kỳ chuỗi độ dài nào (ví dụ: 'foo' * 20công trình).

>>> print 'a' * 20
aaaaaaaaaaaaaaaaaaaa

Nếu bạn muốn làm điều này nói chung, xây dựng một chuỗi và sau đó in nó một lần. Điều này sẽ tiêu tốn một chút bộ nhớ cho chuỗi, nhưng chỉ thực hiện một cuộc gọi đến print. Lưu ý rằng nối chuỗi sử dụng +=bây giờ là tuyến tính theo kích thước của chuỗi bạn đang nối nên việc này sẽ nhanh.

>>> for i in xrange(20):
...     s += 'a'
... 
>>> print s
aaaaaaaaaaaaaaaaaaaa

Hoặc bạn có thể làm điều đó trực tiếp hơn bằng cách sử dụng sys.stdout . write () , đó printlà một trình bao bọc xung quanh. Điều này sẽ chỉ viết chuỗi thô bạn cung cấp cho nó, mà không có bất kỳ định dạng. Lưu ý rằng không có dòng mới nào được in ngay cả khi kết thúc 20 agiây.

>>> import sys
>>> for i in xrange(20):
...     sys.stdout.write('a')
... 
aaaaaaaaaaaaaaaaaaaa>>> 

Python 3 thay đổi printcâu lệnh thành hàm print () , cho phép bạn đặt endtham số. Bạn có thể sử dụng nó trong> = 2.6 bằng cách nhập từ __future__. Tôi sẽ tránh điều này trong bất kỳ mã 2.x nghiêm trọng nào, vì nó sẽ hơi khó hiểu đối với những người chưa bao giờ sử dụng 3.x. Tuy nhiên, nó sẽ cung cấp cho bạn một hương vị của một số điều tốt đẹp 3.x mang lại.

>>> from __future__ import print_function
>>> for i in xrange(20):
...     print('a', end='')
... 
aaaaaaaaaaaaaaaaaaaa>>> 

4
@AAI đọc câu hỏi khi có câu trả lời nhân chuỗi, và nghĩ rằng tôi sẽ đưa ra một cái nhìn tổng quan về một số tùy chọn. Những người khác đến trong khi tôi đang cùng nhau trả lời. Nó đã được chấp nhận ngay sau đó, nếu không tôi có thể đã xóa nó.
moinudin

10
-1 Không xây dựng chuỗi bằng cách nối; đó là O (n ^ 2) thay vì O (n). Sử dụng "".join(...)thay thế.
Katriel

10
Tôi không có vấn đề với câu trả lời của bạn, nó tóm tắt mọi thứ và điều đó tốt. Nhưng bằng cách này, bạn không khuyến khích người khác trả lời. Có rất nhiều câu trả lời hay và tất cả đều xứng đáng +1. Chỉ cần tưởng tượng nếu mọi người bắt đầu thực hiện tóm tắt.
user225312

3
@katrielalex: Có vấn đề gì không? OP đã yêu cầu tối ưu hóa hay phức tạp? Và nó có quan trọng đối với 20 chuỗi không? Thôi nào, bạn nghiêm túc phải nói đùa.
user225312

1
@katrielalex Sai, nối chuỗi sử dụng +=trong Python là một hoạt động thời gian không đổi để nối một ký tự đơn.
moinudin


41

Bạn có thể triệt tiêu khoảng trắng bằng cách in một chuỗi trống thành stdout giữa các printcâu lệnh.

>>> import sys
>>> for i in range(20):
...   print 'a',
...   sys.stdout.write('')
... 
aaaaaaaaaaaaaaaaaaaa

Tuy nhiên, một giải pháp sạch hơn là trước tiên hãy xây dựng toàn bộ chuỗi bạn muốn in và sau đó xuất nó bằng một printcâu lệnh duy nhất .


4
@Soulseekah: Có, chỉ sử dụng sys.stdout.write()sẽ thuận tiện hơn trong trường hợp này. Tuy nhiên, tôi muốn chỉ ra rằng việc viết một chuỗi rỗng vào thiết bị xuất chuẩn sẽ triệt tiêu khoảng trắng giữa các phần tử được viết bằng cách sử dụng print, có thể hữu ích trong các tình huống tương tự.
Pär Wieslander

34

Bạn có thể in một ký tự backspace ( '\b'):

for i in xrange(20):
    print '\ba',

kết quả:

aaaaaaaaaaaaaaaaaaaa

30

Python 3.x:

for i in range(20):
    print('a', end='')

Python 2.6 hoặc 2.7:

from __future__ import print_function
for i in xrange(20):
    print('a', end='')

10

Nếu bạn muốn chúng xuất hiện cùng một lúc, bạn có thể làm điều này:

import time
import sys
for i in range(20):
    sys.stdout.write('a')
    sys.stdout.flush()
    time.sleep(0.5)

sys.stdout.flush() là cần thiết để buộc ký tự được viết mỗi khi vòng lặp được chạy.


7

Cũng như một ghi chú bên lề:

In là O (1) nhưng xây dựng một chuỗi và sau đó in là O (n), trong đó n là tổng số ký tự trong chuỗi. Vì vậy, có, trong khi xây dựng chuỗi là "sạch hơn", đó không phải là phương pháp hiệu quả nhất để làm như vậy.

Cách tôi sẽ làm như sau:

from sys import stdout
printf = stdout.write

Bây giờ bạn có một "chức năng in" in ra bất kỳ chuỗi nào bạn cung cấp mà không trả lại ký tự dòng mới mỗi lần.

printf("Hello,")
printf("World!")

Đầu ra sẽ là: Xin chào, Thế giới!

Tuy nhiên, nếu bạn muốn in các số nguyên, số float hoặc các giá trị không phải chuỗi khác, bạn sẽ phải chuyển đổi chúng thành một chuỗi có hàm str ().

printf(str(2) + " " + str(4))

Đầu ra sẽ là: 2 4


Bạn có nói rằng tôi có thể xuất ra một lượng văn bản vô hạn cùng lúc với việc xuất ra một ký tự không?
ctrl-alt-delor

Khi tôi xác định lại printf thành stdout.write, stdout.write của tôi dường như đang in số lượng biểu đồ của chuỗi là: "Xin chào, 6" Điều gì mang lại? Chuyện gì đang xảy ra vậy? Và làm thế nào để tôi ngăn chặn nó?
Tom

1
Ngoài ra, bạn có thể giải thích ý của bạn về O (1) O (n) không? Tôi không hiểu điều đó đề cập đến
Tom

@Tom Nói đến sự phức tạp (ký hiệu Big O) là sự phản ánh chi phí của hoạt động. O (1) là hằng số thời gian - lý tưởng - và O (n) là thời gian tuyến tính - ổn nhưng cách quá đắt đối với một cái gì đó đơn giản như vậy. Mặc dù, đối với những việc nhỏ, thời gian bạn sử dụng bộ não của mình để lo lắng về những điều này sẽ lãng phí về mặt tính toán hơn là chỉ sử dụng nối chuỗi.
Benjamin R

6

Hoặc là những gì Ant nói , hoặc tích lũy thành một chuỗi, sau đó in một lần:

s = '';
for i in xrange(20):
    s += 'a'
print s

6

không có gì ý bạn là

>>> print 'a' * 20
aaaaaaaaaaaaaaaaaaaa

?


3

điều này thực sự đơn giản

đối với phiên bản python 3+, bạn chỉ phải viết các mã sau

for i in range(20):
      print('a',end='')

chỉ cần chuyển đổi vòng lặp thành các mã sau đây, bạn không phải lo lắng về những thứ khác


2

Ôi !!!

Nó khá thời gian dài trước đây

Bây giờ, trong python 3.x nó sẽ khá dễ dàng

mã:

for i in range(20):
      print('a',end='') # here end variable will clarify what you want in 
                        # end of the code

đầu ra:

aaaaaaaaaaaaaaaaaaaa 

Tìm hiểu thêm về hàm print ()

print(value1,value2,value3,sep='-',end='\n',file=sys.stdout,flush=False)

Đây :

value1,value2,value3

bạn có thể in nhiều giá trị bằng dấu phẩy

sep = '-'

3 giá trị sẽ được phân tách bằng ký tự '-'

bạn có thể sử dụng bất kỳ ký tự nào thay vì chuỗi chẵn như sep = '@' hoặc sep = 'good'

end='\n'

theo chức năng in mặc định, đặt charater '\ n' ở cuối đầu ra

nhưng bạn có thể sử dụng bất kỳ ký tự hoặc chuỗi nào bằng cách thay đổi giá trị variale cuối

như end = '$' hoặc end = '.' hoặc kết thúc = 'Xin chào'

file=sys.stdout

Đây là một giá trị mặc định, đầu ra tiêu chuẩn hệ thống

sử dụng đối số này, bạn có thể tạo một luồng tệp đầu ra như

print("I am a Programmer", file=open("output.txt", "w"))

bằng mã này, bạn sẽ tạo một tệp có tên output.txt nơi đầu ra của bạn Tôi là Lập trình viên sẽ được lưu trữ

flush = False

Đó là một giá trị mặc định bằng cách sử dụng flush = True, bạn có thể cưỡng chế luồng


2

đơn giản vậy thôi

def printSleeping():
     sleep = "I'm sleeping"
     v = ""
     for i in sleep:
         v += i
         system('cls')
         print v
         time.sleep(0.02)
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.