2015-06-22 30 views
0

(更新)我需要找到具有450萬個狀態的馬爾可夫鏈的固定分佈。這意味着我需要用450萬個方程來求解線性系統。每個狀態是一個大小爲6的向量。我試圖將每個狀態存儲在一個列表中。以下是我創建所有可接受狀態的部分努力。在Python中編寫嵌套for循環的整潔方式

我想通過一大組數字循環並創建一組向量。這裏是我的代碼的簡化版本:

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這樣做的更好,更有效的方法?

謝謝

+0

我投票作爲題外話,因爲它屬於上http://codereview.stackexchange.com/ –

+1

@CoreyOgburn如果關閉這個問題也許是來自真實項目的實際代碼。現在,它是假設的/示例代碼,它明確地與代碼評審相關。而且,更適合CR也不是一個緊密的原因;幫助遷移您需要自定義的問題以供版主注意。 –

+1

做一次然後序列化它,所以下一次你需要它時,你可以*只讀*。 – wwii

回答

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

我完全不明白你試圖用你的列表存檔的內容。 你可以得到相同的輸出與此:

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]) 
0
from itertools import product 
mylist =[[i,j,k] for i,j,k in product(range(1,4),range(1,4),range(2))]