Cup*_*ups 3 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]]
"""
Run Code Online (Sandbox Code Playgroud)
我创建了这个解决方案,对我而言,它似乎最合乎逻辑,与之前的编程经验相匹配,我或多或少打字,因为我在想...
# 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
Run Code Online (Sandbox Code Playgroud)
然后我找到了这个以"列表理解"为特色的解决方案(为了更好地理解两种解决方案之间的差异,我将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
Run Code Online (Sandbox Code Playgroud)
第二个解决方案是构建一个基于零的矩阵,它与预期答案的形状相匹配,但这个方法的意思是"列表理解",还是更多的是在这里?
这是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
Run Code Online (Sandbox Code Playgroud)
我怀疑还有第三种(以及更多)解决方法,使用lambda,但我想我先要求对这两种方法发表评论.
示例来自http://openbookproject.net/thinkcs/python/english2e/ch09.html
编辑现在 有更好的处理列表理解,这里给出答案.
仍然,任何人都可以解释创建一个空白矩阵的逻辑,正确的答案放在哪里,而不是创建一个新的列表?
列表理解只是一种基于另一个列表创建列表的方法.(或其他可迭代项目)
例如,如果我们有一个列表a = [1, 2, 5, 7],那么我们可以创建一个列表b,包含a两种方式的doubled 值.
b = []
for e in a:
b.append(2*e)
Run Code Online (Sandbox Code Playgroud)
b = [2*e for e in a]
Run Code Online (Sandbox Code Playgroud)
没有什么比这更重要了.它只是基于列表构建列表的一种很好的语法.
| 归档时间: |
|
| 查看次数: |
3187 次 |
| 最近记录: |