質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

4回答

741閲覧

[Python]配列の代入について

ddss

総合スコア15

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1グッド

1クリップ

投稿2020/05/11 15:35

編集2020/05/11 15:38

days_of_month = [
[31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31],
[31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
][is_leap_year]

上記のような宣言をしたときに
is_leap_year = 0の時は、[31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
is_leap_year = 1の時は、[31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
がdays_of_monthに入ります。

感覚的には何となくわかるのですが、いまいちピンとこない状態です。
説明していただける方、どこか参考になるサイト等教えていただけると幸いです。

よろしくお願いいたします。

DrqYuto👍を押しています

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

ベストアンサー

何が原因で理解を妨げているのかを分析しましょう。

Python

1i = 0 2foo = [10,20] 3bar = foo[i]

↑これが分かって、

Python

1i = 0 2bar = [10,20][i]

が理解しにくいと言う事ですよね?

これは、

Python

1foo = 2+3 2bar = foo*9

と、

Python

1bar = (2+3)*9

の関係と同じです。
変数fooが他で使われていない限り、同じ結果です。

投稿2020/05/11 23:56

otn

総合スコア85901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ddss

2020/05/12 13:12

ありがとうございます! はい! i = 0 bar = [10,20][i] この書き方が理解しずらいなと思っていました。 ただ bar = (2+3)*9 でなんかひらめいた気がします。 行列の掛け算?みたいな感じなのかなと またよろしくお願いいたします。
otn

2020/05/12 13:16 編集

> 行列の掛け算? ??? 最初の、 i = 0 foo = [10,20] bar = foo[i] から理解できてないと言う事ですか? 掛け算は全く関係なくて、添え字による配列要素の参照です。 fooの後の[]の中に0が来ると[10,20]の先頭要素10、1が来ると[10,20]の2番目の要素20を表します。
ddss

2020/05/12 13:24

すみません。勘違いしていました。 i = 0 foo = [10,20] bar = foo[i] これで、完全に理解しました。 [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31], [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] この部分を変数と考えて、そのあとの添え字で参照しているんだなと。 すっきりしました!ありがとうございます。 ベントアンサーとさせていただきます。
otn

2020/05/12 13:37 編集

> この部分を変数と考えて、そのあとの添え字で参照しているんだなと。 ちょっと違います。 [ [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31], [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] ] は、2要素のリストデータで、それに添え字を付けて要素を参照しています。 そのデータにdays_of_monthという名前を付けているだけで、 データに名前を付けるか付けないかは、本質的なことでは無いです。 greeting = "こんにちは" print(greeting) と print("こんにちは") の意味することは同じです。 あなたの書いた理屈で言うと、「後者は"こんにちは"を変数だと考えている」となりますが、おかしな考えです。
ddss

2020/05/12 13:53 編集

ありがとうございます。 はい、 > 2要素のリストデータで、それに添え字を付けて要素を参照しています。 こちらのほうは理解できたと思います。 先に教えてくださったように i = 0 foo = [10,20] bar = foo[i] こちらのように変数に置き換えて考えてみると理解しやすいなと。(実際には変数には置き換えてないと思っています。
guest

0

そのコードは横着しすぎてます。
こうしたらわかりやすいでしょうか。

python3

1# coding: utf-8 2months = [[31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] \ 3 ,[31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]] 4 5is_leap_year = 0 6days_of_month = months[is_leap_year] 7print(days_of_month) 8is_leap_year = 1 9days_of_month = months[is_leap_year] 10print(days_of_month)

新しく作った配列 months には要素が2つあります。
months[0]にはうるう年でない場合の月ごとの日数、
months[1]にはうるう年の場合の月ごとの日数が入ります。
このコードと説明で理解できるでしょうか。

monthsを一旦変数に入れずにdays_of_monthへの代入を一気にやろうとすると質問のようなコードになります。
個人的意見ですが、こんな書き方は真似してほしくない。

投稿2020/05/11 15:44

hope_mucci

総合スコア4447

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ddss

2020/05/12 13:12 編集

ありがとうございます! コードも理解できました。 今回の書き方については、なるべく使わないしたいと思います。 またよろしくお願いいたします。
guest

0

私なら、つぎのようにしますね。

python3

1DAYS_OF_MONTHS = { 2 False: [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31], 3 True: [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] 4} 5 6# is_leap_year = True # False 7# the_days_of_month = DAYS_OF_MONTHS[is_leap_year] 8 9print(DAYS_OF_MONTHS[True]) 10print(DAYS_OF_MONTHS[False])

質問文のコードでは、 is_leap?_year は 本来 bool 値なのに
それを 0, 1 の integer に割当てています。さらに それを配列アクセスの添字に使っているのです。
しかも 配列の構造が [12][2]となっていて、直感とすこしずれているのです。([月の日数][年の種類] の順番になっている)

私が示したコードでは is_leap_year を True, False としています。
そして dict[is_leap_lear] で [月] の配列が得られるようにしているし、
dict の書き方も 年の種類 -> 月の日数の配列 という順序で宣言をしています。

投稿2020/05/12 11:54

katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ddss

2020/05/12 13:20

ありがとうございます! 失礼しました。おっしゃる通り実際のコードでは bool値が設定されていました。 > dict の書き方も 年の種類 -> 月の日数の配列 という順序で宣言をしています。 年、月という考え方でだいぶわかりました。 そしてなんかひらめいた気がしました! またよろしくお願いいたします。
guest

0

わかりやすいように、

is_leap_year = 0 days_of_month = [ [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31], [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] ][is_leap_year] print days_of_month[is_leap_year] > [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

この宣言を分解すると、

is_leap_year = 0 days = [ [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31], [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31] ] days_of_month = days[is_leap_year] print days_of_month[is_leap_year] > [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]

上記のような宣言をしたときに

is_leap_year = 0の時は、[31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
is_leap_year = 1の時は、[31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]
がdays_of_monthに入ります。

というのは、
days[0]

days[1]
を考えてみればわかると思います。

投稿2020/05/11 15:51

編集2020/05/11 15:52
patapi

総合スコア820

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ddss

2020/05/12 13:12 編集

ありがとうございます! 分解のほうは実際に自分でも試してみて、納得はいきました。 ただ、 is_leap_year = [[31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31], [31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]][0]のような書き方だと 何もないところを指してるような感じがしていて、もやもやしてました。 こうゆう書き方もあるっていうところで覚えるしかないですね。 またよろしくお願いいたします。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問