我该如何通过列表理解来优化此代码?

时间:2020-04-02 09:24:14

标签: python for-loop list-comprehension

我有这种方法,可以创建一个包含零和一的列表的列表。 例如,(单位= 3)的输出为:[[1,0,0],[0,1,0],[0,0,1]] 如何使用列表理解功能减少行数?我认为一行就足够了。

major_list = []  # contains lists full off zeros and ones and at the end converted to a matrix
for i in range(unit):
    major_list.append([0] * unit)
    major_list[i][i] = 1

6 个答案:

答案 0 :(得分:1)

您无法比使用numpy.identity()更快:

np.identity(3)

代码

import numpy as np

unit = 3
major_array = np.identity(unit)

答案 1 :(得分:1)

使用列表功能,您可以加入3个子列表

major_list = [[0] * i + [1] + [0] * (unit - i - 1) for i in range(unit)]
print(major_list)

或者更好地与numpy一起使用Performante方式

major_list = numpy.identity(3)
print(major_list)

答案 2 :(得分:1)

测试此处建议的不同方法的性能,并假设所需的最终结果是列表列表(而不是numpy数组),最快的时间为2.091秒,单位= 10k为:

major_list = [[0] * i + [1] + [0] * (unit - i - 1) for i in range(unit)]

numpy方法变为:

major_list = numpy.identity(unit).astype(int).tolist()

并且以2.359秒的速度排名第二。

我的方法:

major_list = [[1 if i == index else 0 for i in range(unit)]
    for index in range(unit)]

远远落后于6.960秒。

最后:

major_list = [[int(c==r) for c in range(unit)] for r in range(unit)]

持续17.732秒

答案 3 :(得分:0)

如果通过优化意味着减少行数(不一定使其更快),则可以使用以下内容:

parseInt(value[i]) 
unit = 4
major_list = [
    [ 0 ] * (i) + 
    [ 1 ] +
    [ 0 ] * (unit - i - 1) 
    for i in range(unit)
]

for i in major_list:
    print(i)

答案 4 :(得分:0)

以下内容使其非常简洁:

major_list = [[int(c==r) for c in range(unit)] for r in range(unit)]

这会将1放在列索引等于行索引的位置,0放在其他位置。

答案 5 :(得分:0)

您可以尝试以下方法:

def frame_matrix(unit):
    return [[int(1)  if i==j else 0 for i in range(unit)] for j in range(unit)]