2017-09-03 9 views
0

(Pythonで)初級クラス複数の行に文字列を出力する

私は自宅でedxコースを利用してプログラミングを進めています。私が打ち込んだ課題の1つに、私は困惑しています。目標は、整数を挿入してtimesテーブルを出力できるようにすることです。

この表は、列と行に分割されます。私は、必要な値を、可変の入力が与えられたときのすべての数の文字列に組み立てることができます。私は整数の間に呼び出されるタブを追加しました。

これは1つの文字列であり、最初に入力したさまざまな値に基づいてさまざまな大きさの隙間に入り、印刷することはできません。

テキストの折り返しを試しましたが、別の例に基づいてどのように配置してもエラーは発生しました。

解決策を見つけて、なぜそれが機能するのかを説明してください。私はこの問題を解決するスパンコーディングされたコードラインを持っていないが、私にはまだ無知なままにしておくことを学ぶことを試みている。

このクラスのスラックで見つかったヒントのうち、これまでにコースに掲載されている用語やコマンドはありませんでした。しかし、リストされていない多く。

これは私が持っているものであり、別の解決策を試して残ったエクストラを無視してください。

mystery_int = 5 

#You may modify the lines of code above, but don't move them! 
#When you Submit your code, we'll change these lines to 
#assign different values to the variables. 

#This is a tough one! Stick with it, you can do it! 
# 
#Write a program that will print the times table for the 
#value given by mystery_int. The times table should print a 
#two-column table of the products of every combination of 
#two numbers from 1 through mystery_int. Separate consecutive 
#numbers with either spaces or tabs, whichever you prefer. 
# 
#For example, if mystery_int is 5, this could print: 
# 
#1 2 3 4 5 
#2 4 6 8 10 
#3 6 9 12 15 
#4 8 12 16 20 
#5 10 15 20 25 
# 
#To do this, you'll want to use two nested for loops; the 
#first one will print rows, and the second will print columns 
#within each row. 
# 
#Hint: How can you print the numbers across the row without 
#starting a new line each time? With what you know now, you 
#could build the string for the row, but only print it once 
#you've finished the row. There are other ways, but that's 
#how to do it using only what we've covered so far. 
# 
#Hint 2: To insert a tab into a string, use the character 
#sequence "\t". For example, "1\t2" will print as "1 2". 
# 
#Hint 3: Need to just start a new line without printing 
#anything else? Just call print() with no arguments in the 
#parentheses. 
# 
#Hint 4: If you're stuck, try first just printing out all 
#the products in one flat list, each on its own line. Once 
#that's working, then worry about how to organize it into 
#a table. 


#Add your code here! 
import textwrap 
a = mystery_int 
b = 1 
c = 0 
d = 1 
e = "" 
f = "" 
g = "" 
h = "\t" 
j = 1 
k = a*2 

for b in range(1,a + 1): 
    for c in range(1,a+1): 
     d = b * c 
     e +=str(d)+"," 
     f = str(e) 

g = str.replace(f,"," ,"\t") 

#textwrap.wrap(g,10) 
#print(g[0:int(k)]) 
print(g[:k]) 
+1

"\ t"ではなく "\ n"を使用して、タブではなく新しい行を取得することができます。しかし、あなたが与えられたヒントから、行を個別に印刷すること、つまり行ごとに別々の文字列を作成して印刷することが期待されるように見えます。 – RuthC

+0

ありがとうございます。はい、文字列を異なるサイズのセクションに分割して初期変数と一致させ、それを印刷して私に合うようにする方法です。 – rmcrow2

答えて

1

あなたはほとんどそこにいる、あなただけのリストの行ごとに値を収集して、内側のループの各反復の後に行の値を印刷する必要があります。

いくつかの小さなバグを除いて、基本的にすでに完全なソリューションが用意されていることを考えれば、解説と解説を完全に説明します。

表記:私たちは、代わりにamystery_int使用します、と私たちは大会に合わせて、jiからb(外側のループの増分)、およびc(内部ループの増分)を変更します:

mystery_int = 5 

for i in range(1, mystery_int+1): 
    row = [str(i)] 
    for j in range(2, mystery_int+1): 
     row = row + [str(i*j)] 
    print('\t'.join(row)) 

出力:カラム上

1 2 3 4 5 
2 4 6 8 10 
3 6 9 12 15 
4 8 12 16 20 
5 10 15 20 25 

アウターループ(i)行を反復し、インナーループ(j)。
新しい行ごとに、1つの要素だけを持つ新しいリストrowが必要です。最初の要素は倍数になる数です(1行目の最初の要素は1、2行目の最初の要素は2など)。

すべての整数を文字列(i - >str(i))に変換していることに注意してください。最終的に各行を空白で区切られたシーケンスとして出力する必要があります。

  • 印刷するコンテンツが数字で構成されていても、その内容を文字列表現に変換する必要があります。 (あなたはすでにコードでこれを行っていますが、それは一般的な障害として繰り返される価値があります。)

次に、内側ループ(j)において、最初の(i*2i*3、...、i*mystery_int)の後に、各列の積を計算します。内部ループの各パスについて、新しい製品をrowに追加します。内部ループが終了するまでに、整数iで始まる行の乗算系列の完全なリストが得られます。

次の行に移動する前に、現在の行を印刷します。 メソッドは、.の前に指定されたセパレータを使用して、リスト内の要素を接続する一般的な方法です。例えば

  • ' '.join(row)はシングルスペースで区切られた値の文字列を作成します。

    ' '.join(["1","2","3","4","5"]) 
    # '1 2 3 4 5' 
    
  • 私は、印刷出力がよりよいフォーマットを持っているように、タブで区切られた文字列を使用することにしました。 (一部の行が二桁の数字と他は唯一の一桁の数字を持っているので、シングルスペース区切り列がずれて表示されます。)

注:

  • 教育の観点からそれぞれの新しいrowを "base"の整数irow = [str(i)]で初期化する方が直感的です。これは、内側のループの内側で、その後に続く行の計算のための視覚的な固定を提供します。しかし、それも有効です(多分ビット「クリーナー」)は、単に空のリスト、row = []を初期化し、その後、j = 1で内側のループを開始するために:

    for i in range(1, mystery_int+1): 
        row = [] 
        for j in range(1, mystery_int+1): 
         row = row + [str(i*j)] 
        print('\t'.join(row)) 
    
  • 追加のモジュールを使用すると、それは同じことを達成することが可能ですより単純で、しばしば高速なコードで目標を達成できます。あなたがPythonの標準ライブラリを使っているように見えるので、私は主な解決策で基本を守っています。あなたが使用することを始めると、

    import numpy as np 
    print(np.array2string(np.outer(np.arange(1, mystery_int+1), 
               np.arange(1, mystery_int+1)), 
             separator='\t')) 
    

ポイントビーイング:しかし、乗算テーブルは実際には2つの同一のベクトルの外積であることを考えると、我々はまた、迅速な数学的な操作の多くを提供しNumpyモジュールを、使用することができますPythonはプログラミングの基礎を学ぶのではなく、与えられたタスクをより多く達成するために、ニーズに合わせてリアルタイムに節約できるモジュールがあると仮定するのが妥当です。 just about everythingのPythonモジュールがあります。

+0

ありがとうございました。それは、なぜそれが働くのか理解できるようにする必要があるという説明です。私はあなたのために時間を割いて、すべてのことをそのようにすることに感謝しています。私はプログラミングとソフトウェア開発に私のキャリアパスをシフトするためのプログラミングを学ぶためにPythonを学んでいるので、私は事の理由を理解する必要があるだけで各コースの問題を解決することはありません。もう一度私はあなたに感謝します。 – rmcrow2

+0

大歓迎です!あなたのキャリアシフトに幸運。この回答があなたの質問に対する最良の回答であれば、回答の左側にあるチェックマークをクリックして受け入れてください。 –

関連する問題