iT邦幫忙

2

[python]輸出超過字數換行

https://ithelp.ithome.com.tw/upload/images/20200614/20126988BBZAb3up6z.pnghttps://ithelp.ithome.com.tw/upload/images/20200614/20126988rSY14LFMoh.png
練這個題目的時候,卡在不知道要怎麼寫,使印出那行超出40字後換行輸出

8 9 12 16 18 20 24 27 28 32 36 40 44 45 48 52 54
變成
8 9 12 16 18 20 24 27 28 32
36 40 44 45 48 52 54

求解!謝謝大大

4
心原一馬
iT邦研究生 5 級 ‧ 2020-06-14 20:24:28
最佳解答

您好,這邊我提供一個策略,
用「計數器」的概念,
計算目前我已經累積輸出幾個字了。

我先設定一個變數叫作cnt
初始值設為0
每當我找到一個數字可以被4 or 9整除時,
我就把cnt的值+1,
每當cnt的值累積到10(因為每個數4個字元,10個數就40個字元),
就印出一個換行

另外想修正你的程式碼邏輯,
你寫的while迴圈是多餘的,
因為while進去之後就break掉了,
這個while其實等於沒有

程式碼如下:

a = int(input())
b = int(input())
list1 = []
cnt = 0 # 設定一個計數器
for i in range(a, b+1):
    if i%4==0 or i%9==0:
        print(str(i).ljust(4), end='')
        list1 += [i]
        cnt += 1
    if cnt == 10:
        print() #當計數器累積到10個時(即40個字元),換行
        cnt = 0 #計數器歸零

print('\t')
print(len(list1))
print(sum(list1))

另外,建議您未來在問問題時,
可以順便把程式碼貼上來,
方便答題者複製測試你的程式碼,
省去重新打一次的麻煩~

如解答有幫助,
還請不吝給予最佳解答,謝謝您~

lydia0231 iT邦新手 5 級 ‧ 2020-06-14 20:39:25 檢舉

謝謝!學到了新方法。程式邏輯對我這種新手來說很重要,感謝指出!下次我發問會記得直接貼code。

心原一馬 iT邦研究生 5 級 ‧ 2020-06-14 21:20:55 檢舉

好的,謝謝您的感謝,很高興能幫到你~

1
海綿寶寶
iT邦大神 1 級 ‧ 2020-06-14 20:27:46
            list1+=[i]

改成

            list1+=[i]
            if len(list1)%10==0:
                print("")
lydia0231 iT邦新手 5 級 ‧ 2020-06-14 20:40:52 檢舉

謝謝!很輕巧的寫法!

lydia0231 iT邦新手 5 級 ‧ 2020-06-14 21:14:14 檢舉

雖然順利地執行了,但有一點不解想請教。
if len(list1)%10==0:
print("")

寫在*print(str(i).ljust(4),end='')*後面,為什麼不會影響執行,程式按順序讀取,不是會先印完整行再判斷len嗎

其實不用%也可,數量等於10就能換行。

1
褲底農民
iT邦新手 5 級 ‧ 2020-06-14 21:55:47

獻醜一下

a = int(input())
b = int(input())

num = list(x for x in range(a, b+1))
count = 0
num_list = list()
for i in num:
    if i%4==0 or i%9==0:
        if count<9 or count>9:
            num_list.append(i)
            print(i, '...', sep='', end='')
            count += 1
        elif count==9: #用一下上面大大的方法 elif len(num_list)==10:
            print(i, '...', sep='', end='\n')
            num_list.append(i)
            count += 1
        
print(f"\n{count}")
print(sum(num_list))
3
一級屠豬士
iT邦大師 1 級 ‧ 2020-06-14 22:10:33
#!/usr/bin/env python3

str1 = '8   9   12  16  18  20  24  27  28  32  36  40  44  45  48  52  54'
chunk_size = 40
result = [str1[y - chunk_size: y] for y in range(chunk_size, len(str1)+chunk_size, chunk_size)]
print(*result, sep='\n')

https://ithelp.ithome.com.tw/upload/images/20200614/20050647dWSV3SoX2A.png

看更多先前的回應...收起先前的回應...

/images/emoticon/emoticon13.gif

計算部分歸計算部分,後面再利用 list slicing 功能切割,然後列印.這樣比較單純些.

/images/emoticon/emoticon12.gif

其實這個發問可能是個誤解,以我的理解,好像也沒有40字就要換行的要求,就那本書印不下,排版的關係.
我就只針對切割列印這塊補充一下.

lydia0231 iT邦新手 5 級 ‧ 2020-06-15 20:38:16 檢舉

謝謝,學到了,"計算歸計算,印出格式另外設定"

2
froce
iT邦大師 1 級 ‧ 2020-06-15 11:22:25

同意計算部分應該歸計算部分。
轉換成str和顯示應該用別的函式去做。我是懶就直接 list comprehension。

a = 5
b = 55
countResult = [x for x in range(a, b+1) if x % 4 == 0 or x % 9 == 0]
strResult = ["{}   ".format(str(i))[:4] for i in countResult]
[print(x, end="") if i % 9 != 0 or i == 0 else print(x) for i, x in enumerate(strResult)]

enumerate()很好用,會傳回可疊代物件的索引和元素。

後來想想好像for也沒比較多字...

countResult = [8, 9, 12, 16, 18, 20, 24, 27, 28, 32, 36, 40, 44, 45, 48, 52, 54]
for i, x in enumerate(countResult):
    if i % 9 != 0 or i == 0:
        print("{}   ".format(str(x))[:4], end="")
    else:
        print("{}   ".format(str(x))[:4])

python 真是奇妙的語言
單看下面這列的話

[print(x, end="") if i % 9 != 0 or i == 0 else print(x) for i, x in enumerate(strResult)]

有點像是拿英文的倒裝句型來用

今天又學到新知識了
/images/emoticon/emoticon33.gif/images/emoticon/emoticon41.gif

froce iT邦大師 1 級 ‧ 2020-06-15 11:59:07 檢舉

那再補一個用法好了,不要else的話得這樣寫:

countResult = [x for x in range(a, b+1) if x % 4 == 0 or x % 9 == 0]

list comprehension只適合for只有一、二層的時候,太多層乖乖寫for或拿出來當函式。

lydia0231 iT邦新手 5 級 ‧ 2020-06-15 20:40:52 檢舉

學到了~這個寫法很酷

我要發表回答

立即登入回答