我试图确定我对列表的理解和最佳使用,我遇到了列表理解并阅读了大量关于它们的内容,但我对一个特定的紧迫问题感到窒息。

鉴于这一挑战:

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

我怀疑有第三种(以及更多)方法可以使用 lambda 来解决这个问题,但我想我会先征求对这两种方法的评论。

取自 http://openbookproject.net/thinkcs/python/english2e/ch09.html 的示例

编辑
现在对列表理解有了更好的处理,感谢这里给出的答案。

尽管如此,谁能解释创建一个空白矩阵的逻辑,其中放置正确的答案与仅创建一个新列表?

最佳答案

列表理解只是一种基于另一个列表创建列表的方法。 (或其他可迭代项目)

例如,如果我们有一个列表 a = [1, 2, 5, 7] ,那么我们可以创建一个列表 b ,其中包含以两种方式加倍的 a 的值。

没有列表理解

b = []
for e in a:
    b.append(2*e)

使用列表理解
b = [2*e for e in a]

没有什么比这更重要的了。这只是基于列表构建列表的一种很好的语法。

也可以看看:
  • Python: List Comprehensions
  • List Comprehensions on (An Unofficial) Python Tutorial Wiki
  • 关于python - 理解列表理解与传统循环和构建,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6563314/

    10-13 00:08