2017-11-30 8 views
0

私はPythonを学んでいます。これはプログラミングに関する私の最初の本当の経験です。私はhereという一連のレッスンを経験しています。Pythonでリストインデックスの名前を変更する - コードの説明を求める

私が教えているレッスンは、ネストループに関係しています。しかし、1つの練習では、リスト項目のインデックスの名前を本質的に変更することによって、問題に対する解決策を提供します。これは辞書が使われていないことを覚えておいてください。これらのレッスンはすばらしく進んでいますが、この問題に対するこの1つの答えは、何が起こっているのかについての説明がないので、私を困惑させます。さらに、レッスンシリーズや他の場所でこのテクニックを参照することはできません。

ここでは、練習で私に求めていることがあります。 1 "ネストされたforループを使用してカレンダーを表す3次元リストを作成するプログラムを作成します。最上位リストには各月のサブリストが含まれ、各月には4週間が含まれます。空のリスト 2コードを変更して、カレンダーの月に人間が読める月の名前でアクセスしやすくし、毎週1から番号が付けられた名前でアクセスしやすくします。 7月の第二週までの文字列の説明)。

最初の部分は全く問題なかった。第二部は、パラメータが与えられた少し挑戦でしたが、与えられた答えは、私が期待したものではなかった。

私が見てきましたディクショナリを使用したスタックオーバーフローの説明 Python: can I have a list with named indices?

しかし、ここでのソリューションは提供されていました:これは正確にどのように動作するか

(JANUARY, FEBRUARY, MARCH, APRIL, MAY, JUNE, JULY, AUGUST, SEPTEMBER, OCTOBER, NOVEMBER, DECEMBER) = range(12) 

(WEEK_1, WEEK_2, WEEK_3, WEEK_4) = range(4) 

calendar = [] 
for m in range(12): 
    month = [] 

    for w in range(4): 
     month.append([]) 

    calendar.append(month) 
calendar[JULY][WEEK_2].append("Go on holiday!") 
print(calendar) 

誰かが説明でき命名指標の目標のこの種を達成しますか?私は月と週の名前が文字列でなくても変数名であることが奇妙であることを知っています。各変数名は、定義された特定の範囲内の各項目に割り当てられていると思います。しかし、私は変数名がリストのインデックスとして使用できることに驚いています。これが終わると、私は数値でインデックスを参照することはできません。例えば、私が使用することはできません。

calendar[1][1].append("This is the first week of January.") 

私は最後の行の後に単純なループ書くとき、私はさらに、この理由で混乱しています:

for i in range(12): 
    print(i) 

を私のように11までの番号0のプリントアウトを取得しますこれらの変数名は使用できません。

正確には何が起こっているのですか?これはどのように機能しますか?このような変数のリスト宣言

答えて

0

(WEEK_1, WEEK_2, WEEK_3, WEEK_4) = range(4)

は、複数の変数に複数の値を格納する方法です。それは、これを行うと同じである。

(WEEK_1, WEEK_2, WEEK_3, WEEK_4) = (0,1,2,3) 

又はこれ:

WEEK_1 = 0 
WEEK_2 = 1 
WEEK_3 = 2 
WEEK_4 = 3 

範囲(4)が0から3の整数のリストを返します。Pythonで

range(4) == (0,1,2,3) 

、左のオペランドとして変数のリストを作成し、右オペランドのデータのリストを書き込むことによって、それらに値を割り当てることが可能です。この場合、左側のリストの最初の変数は右側の最初のデータの値を格納し、2番目の変数は右側の2番目のデータの値を格納します。

あなたの演習では、月と週は整数としてのみメモリに格納されます。 これらの整数はすべて、各値が表すものを代表する名前の変数に格納されています。

あなたの言ったこととは逆に、calendar[1][1].append("First week of January")は動作します。技術的には、1月の第1週はcalendar[0][0]です。なぜなら、リストのインデックスは0から始まるからです。なぜなら、前述したように、WEEK_1, WEEK_2などは整数が格納される変数名です。したがって、同じ正確なことが数ヶ月間にも起こります。 calendar[JULY][WEEK_2]と言うときは、calendar[7][1]と言ったのとまったく同じことです。今では、これらの数値をより読みやすい変数に格納しているだけです。そのため、コードは読みやすく、読みやすいものをよりよく表しています。

+0

私は、1月の最初の週の私の例では、私はそのインデックスを1つオフにしていることがわかります。私は戻って 'calendar [0] [0] .append(" 1月の第1週 ")'をもう一度試しました。私がIndexErrorを受け取る前に、 'index out of range'と言っていました。しかし、今回は私がしなかった - これは私が私の元の試みで別のエラーがあったと私に信じさせる。 あなたの説明は私には意味があります。インデックスに使用されているこれらの変数のリストを出力する方法がありますか?私は、他のどこの指標にも変数が使われているのを見ていないので、アイデアの全体をより完全に包囲しようとしています。ありがとう! –

+0

私は 'JANUARY = 0、 FEBRUARY = 1'などの割り当てを理解している間に混乱が残っていると思っています。なぜ後で' mの範囲(12)を 'と言っているのか分かりません:変数であり、整数ではありません。私はなぜJANUARY = 0を取得しますが、0 = JANUARYの場合は、後で 'for w in range(4)'と言うとき、この矛盾はなぜ起こりませんか?私はこの情報がどこに保存されているのか把握するのが難しいです。このコードの最後に 'print(list(range(12)))'を追加すると、まだ整数が得られます。なぜこれはあるインスタンスでは変数のセットを参照しますが、別のインスタンスでは参照しませんか? –

1

これでわかりました。私の混乱は、私が変数という名前のインデックスを割り当てていたことが私に現れたことでした。私は今、数字にちょうど名前をつけていることを理解しており、ではなく、のインデックスを理解しています。 indecisは常に整数です。

は、私は、次のいずれかを使用して上記のコード1月に週2を参照することができますので、今、これを参照してください。

calendar[0][1].append("Week 2 of January") 
calendar[JANUARY][WEEK_2].append("Week 2 of January") 
calendar[JANUARY][FEBRUARY].append("Week 2 of January") 
calendar[WEEK_1][WEEK_2].append("Week 2 of January") 

これらのすべては、インデックスを指している[1]、[0]。私は何とか魔法のように私が呼んでいた範囲(12)の機能には影響しませんでした。

関連する問題