2016-12-11 2 views
1

Я научился создавать и управлять вложенными списками, создавая матрицу 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

Что такое обманывание списков? И чтобы ответить на ваш другой вопрос, нормально это или нет, я не думаю, что неправильно искать более элегантные решения. – 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. г. список из 5 последовательных целых чисел, начиная с 0. Если вы делаете что-то для каждого элемента списка, который создает еще один список того же размера, например:

>>>[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] напрямую, но для этой задачи это фактически то же самое.

Смежные вопросы