用于循环初始化的矩阵(Jagged Array)

时间:2014-01-21 05:10:40

标签: python python-2.7

我正在尝试进行内联统一分发初始化,但如果可能,似乎没有找到如何执行此操作。

我的工作代码是:

test = [[1,2,3],[4,5,6],[7,8,9]]
p = []
for row in test:
    prow = [1.0/(len(row)*len(test)) for x in row]
    p.append(prow)
print p
[[0.1111111111111111, 0.1111111111111111, 0.1111111111111111],
 [0.1111111111111111, 0.1111111111111111, 0.1111111111111111],
 [0.1111111111111111, 0.1111111111111111, 0.1111111111111111]]

我的问题是,有没有办法将“for test in test”缩小到相同形式的第二个循环并最终只有1行?类似的东西:

p = [1.0/(len(row)*len(test)) for x in row for row in test]
print p
[0.1111111111111111,
 0.1111111111111111,
 0.1111111111111111,
 0.1111111111111111,
 0.1111111111111111,
 0.1111111111111111,
 0.1111111111111111,
 0.1111111111111111,
 0.1111111111111111]

但显然是正确的结果。线索?

2 个答案:

答案 0 :(得分:4)

我认为:

[[1.0/(len(row)*len(test))]*len(row) for row in test]

如果我正确地阅读你的代码。这里的魔力是因为行中的每个元素都获得相同(不可变)的值,您只需使用正确的值ala [value]*length创建正确长度的列表。

答案 1 :(得分:3)

是的,你要找的是:

In [13]: test = [[1,2,3],[4,5,6],[7,8,9]]

In [14]: p = [[1.0/(len(row)*len(test)) for x in row] for row in test]

In [15]: p
Out[15]: 
[[0.1111111111111111, 0.1111111111111111, 0.1111111111111111],
 [0.1111111111111111, 0.1111111111111111, 0.1111111111111111],
 [0.1111111111111111, 0.1111111111111111, 0.1111111111111111]]

PS:您可能对list comprehension syntax

感兴趣