在python中编写嵌套for循环的巧妙方法

时间:2015-06-22 02:38:02

标签: python list for-loop nested

(更新)我需要找到具有450万个状态的马尔可夫链的固定分布。这意味着我需要用450万个方程来求解线性系统。每个状态都是一个大小为6的向量。我试图将每个状态存储在一个列表中。以下是我创建所有可接受状态的部分工作。

我试图遍历一大组数字并创建一组向量。这是我的代码的简化版本:

mylist=[]
for i in range(1,4):
    for j in range(1,4-i):
        for k in range(0,5-i-j):
            Temp=[i,j,k]
            mylist.extend(Temp)
            print(mylist)
            mylist=[]
            Temp=[]

会给我:

[1, 1, 0]
[1, 1, 1]
[1, 1, 2]
[1, 2, 0]
[1, 2, 1]
[2, 1, 0]
[2, 1, 1]

我的问题是:在Python中有更简洁,更好,更有效的方法吗?

谢谢

3 个答案:

答案 0 :(得分:3)

如果您正在寻找可以创建相同向量的单行代码,可以在python中使用list comprehension

示例 -

myList = [[i,j,k] for i in range(1,4) for j in range(1,4-i) for k in range(0,5-i-j)]
myList
>> [[1, 1, 0], [1, 1, 1], [1, 1, 2], [1, 2, 0], [1, 2, 1], [2, 1, 0], [2, 1, 1]]

虽然我认为这无论是更整洁还是更有效率。

虽然在使用timeit进行一些测试后,我们可以看到列表理解可能会更快一些 -

In [1]: def foo1():
   ...:     l = []
   ...:     for i in range(100):
   ...:                 for j in range(100):
   ...:                         l.append([i,j])
   ...:     return l

In [3]: def foo2():
   ...:     return [[i,j] for i in range(100) for j in range(100)]
   ...: 

In [4]: %timeit foo1()
100 loops, best of 3: 3.08 ms per loop

In [5]: %timeit foo2()
100 loops, best of 3: 2.16 ms per loop

In [6]: %timeit foo2()
100 loops, best of 3: 2.18 ms per loop

In [7]: %timeit foo1()
100 loops, best of 3: 3.11 ms per loop

答案 1 :(得分:1)

我完全没有通过您的列表获得您要存档的内容。 你可以得到相同的输出:

for i in range(1,4):
    for j in range(1,4-i):
        for k in range(0,5-i-j):
            print([i,j,k])

答案 2 :(得分:0)

from itertools import product
mylist =[[i,j,k] for i,j,k in product(range(1,4),range(1,4),range(2))]