创建并填充列表中的每个列表

时间:2016-12-11 23:49:13

标签: python list

我学会了通过构建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。如果代码正常工作但您认为它可能更漂亮,开发人员寻找其他解决方案是否正常?

1 个答案:

答案 0 :(得分:0)

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

我们以size_n5为例。然后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],但对于这项任务,它实际上是相同的。