2015-10-12 87 views
-2

我想填充一個名爲行的字符串列表,其中包含一個名爲A的字典中的值。填充整數。僞代碼應該是這樣的。在python中填充一個列表

for i in xrange(0,256): 
    for j in xrange(0,768): 
     lines[j+4+(512*3)*i]= str(A[i,j]) 

正如你所看到的,我不能直接插入元素的行。這可能嗎?如果是的話我該怎麼做?列表中的行將會非常大,大小爲786435.這取決於我和j。如果任何人都可以幫助我,我將非常感激.BTW我正在使用python 2.7。

+2

這是一個很大的數字,並不是所有的指數都會有價值。你確定列表是正確的數據結構嗎?如果這是一個稀疏序列(並非所有索引都有值),請考慮使用字典。 –

+0

這不是一個稀疏序列,每個索引位置都有一個值。但它們並不是連續填充的。基於我的算法,每一組索引位置都以不同的方式填充。我只給出了一組值的代碼。那麼你建議我用什麼作爲數據結構 – user220789

+0

創建一個包含超過一百萬個字符串的列表將會給你的內存需求帶來一些嚴重的壓力。 –

回答

3

列表是連續的元素序列。你可以創建列表前面,各項指標在存儲到None參考:

lines = [None] * (255 + 4 + (512 * 3) * 767) 

但隨後你會用它1178371(100萬個以上)的元素來創建對象。這會處理的內存相當數量只爲列表對象

>>> import sys 
>>> sys.getsizeof([None] * 1178371) 
9427040 

這就是9MB列表對象單獨,每個參考點到同一None對象(這是一個單身,只是有記憶中有一次)。添加字符串,並且內存需求迅速攀升;很多字符串需要超過40 MB:

>>> sys.getsizeof('') * 1178371 
43599727 

在Python 2,每一個額外的字符將添加一個字節,所以加平均字符串長度倍1MB的要求只是這個名單。如果你的字符串只有3個字符,那還是可行的。總共大約有50MB,但是如果你正在談論5000個字符串,你很容易以千兆字節爲單位。 5000個字符並不是那麼重要。

但是,您的索引不是連續的。你只生產255次767是195585年的指數;你似乎有一個稀疏的數據結構。你會更好使用字典在這種情況下:

lines = {} 
for i in xrange(0,256): 
    for j in xrange(0,768): 
     lines[j + 4 + (512 * 3) * i]= str(A[i, j]) 

這可以作爲寫的,因爲現在每個指數在字典中鍵來代替。

如果你必須產生一個連續的序列,考慮不同的技術。如果從0到最後的所有指數都可以像上面這樣計算出來,那麼可以通過計算來生成每個值;給定一個索引,計算將在該索引處放置的字符串。這樣你就不需要預先製作所有的值。

上述循環指標按照特定的模式,所以你可以簡單地推導出ij從給定指標:(!10個** 6 +元素的列表)

def str_for_index(index): 
    i = index // (512 * 3) 
    j = (index % (512 * 3)) - 4 
    if 0 <= i < 256 and 0 <= j < 768: 
     return str(A[i, j]) 
+0

Thanx我將使用字典來代替。我只是改變了代碼,它也起作用。但是我沒有使用稀疏的數據結構。實際上,每個指數頭寸都有一個價值。它們並不是連續填充的。基於我的算法,每一組索引位置都以不同的方式填充。我只給出了一組值的代碼。 – user220789

+0

@ user220789:列表中的超過一百萬個元素可能無法工作*反正*。你可能不得不認真重新考慮你的算法。 –

+0

使用字典的工作,我的意思是代碼做什麼應該做的。但正如你所說,它確實利用了大量的內存。我實際上必須讀取一個圖像文件並存儲字節。後來我必須對它們做很多操作。 – user220789