Я пытаюсь понять свое понимание и лучшее использование списков, я столкнулся с пониманием списков и много читал о них, но задыхаюсь от одного конкретного животрепещущего вопроса.
Учитывая эту задачу:
def matrix_mult(m1, m2):
"""
>>> matrix_mult([[1, 2], [3, 4]], [[5, 6], [7, 8]])
[[19, 22], [43, 50]]
>>> matrix_mult([[1, 2, 3], [4, 5, 6]], [[7, 8], [9, 1], [2, 3]])
[[31, 19], [85, 55]]
>>> matrix_mult([[7, 8], [9, 1], [2, 3]], [[1, 2, 3], [4, 5, 6]])
[[39, 54, 69], [13, 23, 33], [14, 19, 24]]
"""
Я создал это решение, мне оно показалось наиболее логичным и соответствовало моему предыдущему опыту программирования, я более или менее набирал так, как думал...
# 1 using a traditional List buildup method
res = []
for i in range(len(m1)):
sub = []
for j in range(len(m2[0])):
sub.append(row_times_column( m1, i, m2, j ))
res.append(sub)
return res
Затем я нашел это решение, в котором использовалось «понимание списка» (я переименовал vars, чтобы они соответствовали моему, чтобы лучше понять различия между двумя решениями:
# 2 using list comprehension
res = [[0] * len(m1) for x in xrange(len(m2[0]))]
for i in range(len(res)):
for j in range(len(res[i])):
res[i][j] = row_times_column(m1, i, m2, j)
return res
Второе решение — построить матрицу с отсчетом от нуля, которая соответствует форме предполагаемого ответа, но этот метод подразумевается под "пониманием списка", или здесь происходит нечто большее?
Вот определение row_times_column() для полноты.
def row_times_column(m1, row, m2, column):
"""
>>> row_times_column([[1, 2], [3, 4]], 0, [[5, 6], [7, 8]], 0)
19
>>> row_times_column([[1, 2], [3, 4]], 0, [[5, 6], [7, 8]], 1)
22
"""
i = 0
for index, value in enumerate(m1[row]):
i += value * m2[index][column]
return i
Я подозреваю, что есть третий (и многие другие) способ решить эту проблему, используя лямбда, но я подумал, что сначала попрошу прокомментировать эти 2.
Пример взят из http://openbookproject.net/thinkcs/python/english2e/ch09.html< /а>
РЕДАКТИРОВАТЬ Теперь у вас есть гораздо лучшее понимание списка, спасибо за приведенные здесь ответы.
Тем не менее, может ли кто-нибудь объяснить логику создания пустой матрицы, в которую помещаются правильные ответы, а не просто создания нового списка?
res[i][j] =
выдаст ошибку, поскольку элемент не существует; так что вы должны использоватьres.append()
, который не так хорошо читается, как синтаксис здесь. Думаю, это единственная причина. - person littlegreen   schedule 16.04.2013