理解列表理解与传统循环和构建

时间:2011-07-03 14:00:01

标签: python list-comprehension

我正在努力确定我对Lists的理解和最佳使用,我遇到了列表理解并阅读了很多关于它们的内容,但是我对一个特别灼热的问题感到窒息。

鉴于这一挑战:

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

第二个解决方案是构建一个基于零的矩阵,该矩阵与预期答案的形状相匹配,但这个方法的意思是“列表理解”,或者还有更多内容在这里?< / p>

这是row_times_column()def,用于完整性。

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

的示例

修改 现在对列表理解有了更好的处理,请给出答案。

不过,任何人都可以解释创建一个空白矩阵的逻辑,在这个矩阵中放置正确答案而不仅仅是创建一个新列表吗?

5 个答案:

答案 0 :(得分:7)

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

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

没有列表推导

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

使用列表推导

b = [2*e for e in a]

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

另见:

答案 1 :(得分:3)

第一行是列表理解。其余的不是。

 return [[row_times_column(m1, i, m2, j) for j in range(len(res[i]))]
     for i in range(len(res))]

答案 2 :(得分:3)

以下还使用列表推导进行矩阵乘法

def matrix_mult(m1, m2):
  return [[sum(m1[i][k]*m2[k][j] for k in range(len(m2))) for j in range(len(m2[0]))] for i in range(len(m1))]

答案 3 :(得分:1)

PEP 202

中解释了Python中列表理解之间的基本原理
  

列表推导提供了一种更简洁的方法,可以在当前使用map()和filter()和/或嵌套循环的情况下创建列表。

所以这个想法背后真的没有“特殊的诡计”。它只是一个语法扩展,将其作为PEP。

HTH

答案 4 :(得分:1)

Mark Pilgrim在解释列表理解方面做得比我在书Dive into Python中做得更好。这本书非常适合从Python开始,只是一般的好读。推荐使用。

P.S。:在Dive into Python 3

中也有对Python 3的列表理解