我学会了通过构建NxM矩阵并用随机整数填充来创建和管理嵌套列表。
我通过简单的单行解决方案,并努力编写全面的解决方案。
我称第一个解决方案是作弊,因为我从这个网站得到了这个提示,但并没有完全理解它是如何工作的。所以,我试图自己写一个更详细的代码,这很难,而且我还不完全确定我做对了。
原始解决方案:
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。如果代码正常工作但您认为它可能更漂亮,开发人员寻找其他解决方案是否正常?
答案 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]
电子。 G。从0开始的5个连续整数的列表。如果对列表的每个元素执行某些操作,则会创建另一个相同大小的列表,例如:
>>>[88 for n in range(size_n)]
[88, 88, 88, 88, 88]
当然,你不仅仅受简单数字的限制,你基本上可以创造任何东西。例如,空列表:
>>>[[] for n in range(size_n)]
[[], [], [], [], []]
然后,当然,内部列表不必为空,您可以用数字填充它们:
>>>[[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
表达式:
>>> [[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]]]
嵌套列表理解通常是正确的解决方案,一旦习惯了符号,它们就很容易阅读。嵌套循环也可以。
寻找更好的方法来重新编写你的工作代码没有错(我说,相反,看起来不错),除非你发展出一种不健康的痴迷它
对于Python 3 range(5)
实际上并没有直接提供[0, 1, 2, 3, 4]
,但对于这项任务,它实际上是相同的。