簡體   English   中英

在python中填寫列表

[英]Filling up a list in python

我試圖用python中名為A的字典中的值填充一個名為lines的字符串列表。A填充有整數。偽代碼應該是這樣的。

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

如您所見,我無法按行順序插入元素。這可能嗎? 如果是,那么我該怎么做? 列表行將非常大,大小為 786435。這取決於我和 jI,如果有人可以幫助我,我將非常感激。順便說一句,我正在使用 python 2.7 。

列表是元素的連續序列。 您可以預先創建列表,在每個索引處存儲對None的引用:

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

但是隨后您將創建一個包含 1,178,371(一百萬多)個元素的對象。 這將需要相當數量的內存僅用於列表對象

>>> 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

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])

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM