2016-12-11 7 views
1

NxM行列を作成し、乱数で埋めることで入れ子リストを作成して管理する方法を学びました。リスト内の各リストを作成して記入してください。

私はシンプルな1ライナーで解決し、包括的なソリューションを書くのに苦労しました。

私はこのWebサイトからこのヒントを得たが、それがどのように機能するのか完全に理解していなかったので、私は最初の解決法を不正行為と呼びます。だから私は自分自身でもっと詳細なコードを書こうとしましたが、それは難しかったし、私はそれが正しいことを完全には確信していません。

元の溶液:

from random import randint 

size_n = int(input("Number of lists N ")) 
size_m = int(input("Number of elements M ")) 

matrix = [[randint(1,9) for m in range(size_m)] for n in range(size_n)] 
print(matrix) 

私は、ループ内のループの正しいレベルのリストのリストを作成するのに苦労しました。私は一時的な行列に終わるが、私はそれが良い解決策であるとは思わない。

最終的な解決策:

from random import randint 

size_n = int(input("Number of lists N ")) 
size_m = int(input("Number of elements M ")) 
matrix = [] 

for n in range(size_n): 
    tmp = [] 
    for m in range(size_m): 
     tmp.append(randint(1,9)) 
    matrix.append(tmp) 

print(matrix) 

あなたは私が仕事のための正しい解決策であるかを理解するのに役立つことはできますか?

P.S.コードが正常に機能していても、それがよりきれいだと思うのであれば、開発者は別の解決策を探すのが普通ですか?

+1

リスト内包表記についてはどうしたのですか?それが正常であるかどうかにかかわらず、あなたの他の質問に答えるために、より洗練されたソリューションを探すのは間違っているとは思いません。 – Iluvatar

+0

元のソリューションで何が問題になっていますか? – TigerhawkT3

+0

私はこのウェブサイトからこのヒントを得ましたが、その仕組みを完全に理解していませんでした。だから私は自分自身でもっと詳細なコードを書こうとしましたが、それは難しかったし、私はそれが正しいことを完全には確信していません。 –

答えて

0
matrix = [[randint(1,9) for m in range(size_m)] for n in range(size_n)] 

私たちのsize_nは、例えば、5あるとしましょう。次に、range(size_n)は、

[0, 1, 2, 3, 4] 

E.

>>>[88 for n in range(size_n)] 
[88, 88, 88, 88, 88] 

あなたは、もちろん、簡単なことで限定されない:5つの連続した整数のリストには、例えば、同じサイズの別のリストを作成し、リストの各要素のために何かを、行う場合は0で始まります基本的に何でも作ることができます。たとえば、空のリストは:

>>>[[1, 2, 3] for n in range(size_n)] 
[[1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3], [1, 2, 3]] 

それとも別のrange表現を使用することができます。

>>>[[] for n in range(size_n)] 
[[], [], [], [], []] 

すると、当然のことながら、内側のリストが空である必要はありません、あなたは数字でそれらを取り込むことができます内側:

>>> [[range(1, 4)] for n in range(5)] 
[[[1, 2, 3]], [[1, 2, 3]], [[1, 2, 3]], [[1, 2, 3]], [[1, 2, 3]]] 

そして、あなたはちょうど同じように、それらの内側のリストにリストの内包表記を使用することができます。

あなたが退屈またはメモリ不足しているまで、あなたは深く深く行くことができます
>>> [[randint(1, 9) for m in range(1, 4)] for n in range(5)] 
[[8, 4, 3], [6, 7, 2], [6, 8, 2], [9, 6, 1], [9, 1, 2]] 

:あなたは表記に慣れる

>>> [[[randint(1, 9) for n in range(1, 5)] for n in range(1, 4)] for n in range(5)] 
[[[2, 9, 6, 1], [6, 7, 4, 5], [5, 9, 1, 7]], [[5, 2, 9, 3], [1, 8, 9, 7], [8, 4, 4, 8]], [[4, 4, 7, 9], [7, 1, 4, 2], [7, 8, 7, 3]], [[4, 4, 9, 9], [8, 8, 9, 5], [6, 1, 3, 9]], [[5, 9, 3, 2], [7, 5, 4, 7], [7, 7, 4, 3]]] 

ネストされたリストの内包は、通常、適切なソリューションでは、彼らが読みやすいです。ネストされたループもOKです。

正常ではないほど強迫観念を抱かない限り、作業コードを書き直すよりよい方法を探しても何も問題はありません(私は、むしろ見ないことが間違っています)。

range(5)は実際には[0, 1, 2, 3, 4]を直接提供していませんが、このタスクでは事実上同じことです。

関連する問題