在同一范围内进行多个列表推导的更好方法是什么?

时间:2012-07-17 07:59:57

标签: python list-comprehension

目前我的代码如下

A = [matrix_x[i][:n] for i in xrange(0, n)]
B = [matrix_x[i][n:] for i in xrange(0, n)]
C = [matrix_x[i+n][:n] for i in xrange(0, n)]
D = [matrix_x[i+n][n:] for i in xrange(0, n)]

有没有更好的方法来做到这一点,因为我不断循环同一个xrange。在这种情况下,最好不要使用列表推导,只需在单个for循环中将值附加到每个列表。

A,B,C,D = [],[],[],[]
for i in xrange(0,n):
    A.append(matrix_x[i][:n])
    B.append(matrix_x[i][n:])
    ... etc

第二种方式对我来说似乎更有效率。什么方式会更'pythonic'或者还有另一种我没想过的方式

3 个答案:

答案 0 :(得分:2)

不是真的。您可以创造性地使用zip()一次生成所有4个列表,但我会非常难以称之为“更好”。

答案 1 :(得分:1)

我通常更喜欢迭代项目列表本身,而不是xrange(len(list_of_items))并且一次使用第i个项目。以下是如何使用zip查看序列中的每个(this,next)对,然后构建列表:

A,B,C,D = [],[],[],[]
for this_,next_ in zip(matrix_x,matrix_x[1:]):
    A.append(this_[:n])
    B.append(this_[n:])
    C.append(next_[:n])
    D.append(next_[n:])

是的,您可以将其压缩到zip的{​​{1}}:

zip

答案 2 :(得分:0)

result = [(matrix_x[i][:n], matrix_x[i][n:], matrix_x[i+n][:n],matrix_x[i+n][n:])  for i in xrange(0, n)]

然后你必须解压每个元素 A,B,C,D =结果[x]

虽然使用matrix_x作为字符串来做这件事并没有给我带来预期的结果。