2017-01-06 162 views
0

我是Python新手。我試圖用文件夾中一堆圖像的文件名來填充列表。它們都以「frameinstance」開始,然後是0-40之間的數字,即「frameinstance0.png」。我嘗試了下面的代碼,但我得到一個MemoryError錯誤。在Python中填充列表

filenamelist = [] 
i = 0 
for i in range(0,40): 
    filenamelist = [str(filenamelist) + "frameinstance" + str(i)] 

我也試過這個。我的輸出接近,但它不是一個列表。

filenamelist = [] 
i = 0 

for i in range(0,40): 
    filenamelist = str(filenamelist) + "frameinstance" + str(i) 

print(filenamelist) 

輸出爲:[]frameinstance0frameinstance1frameinstance2frameinstance3frameinstance4frameinstance5frameinstance6frameinstance7frameinstance8frameinstance9frameinstance10frameinstance11frameinstance12frameinstance13frameinstance14frameinstance15frameinstance16frameinstance17frameinstance18frameinstance19frameinstance20frameinstance21frameinstance22frameinstance23frameinstance24frameinstance25frameinstance26frameinstance27frameinstance28frameinstance29frameinstance30frameinstance31frameinstance32frameinstance33frameinstance34frameinstance35frameinstance36frameinstance37frameinstance38frameinstance39

回答

5

有了一個基本的列表理解:

filenamelist = ["frameinstance{}".format(i) for i in range(41)] 

在第一個代碼,你隨時更改的filenamelist的值,將其轉換爲字符串越來越長,最終在MemoryError。有關更多信息,請參閱Ryan's answer,特別是爲什麼它不會在第二個代碼中發生。

在第二個代碼,你把[]filenamelist,然後用"frameinstance" + str(i)串聯,所以在每次迭代,你在這個字符串的結尾串連"frameinstancei"。 您最終得到一個以"[]"開頭的字符串,然後是"frameinstancei" 40次。


幾件事情,但:

  • 當你建立一個列表,或者使用列表理解如上的短名單,或使用append方法。通常情況下,請寫filenamelist.append("frameinstance{}".format(i))而不是filenamelist = ...
  • 通過書寫"blah" + str(x) + "blah"被認爲不推薦使用打印字符串。相反,請使用format方法:"blah{}blah".format(x)
  • 不要忘了range(n)會給你整數從0n-1。因此,您的電話應該是range(0,41)而不是range(0,40),並且可能只是range(41)
0

您需要將對象添加到列表中

filenamelist = [] 
i = 0 
for i in range(0,40): 
    filenamelist.append("frameinstance" + str(i)) 
0

您是非常接近你的第一關。有幾件事情要考慮:

  1. 你不需要初始化filenamelisti

  2. 您可以使用列表中理解把for循環的列表構造內filenamelist = ["frameinstance{}".format(i) for i in range(41)]

-1

試試這個:

filenamelist = [] 
for i in range(41): 
    filenamelist.append("frameinstance%s.png" % i) 

或者更Python(快,for循環是蟒蛇緩慢):

filenamelist = ["frameinstance%s.png" % i for i in range(41)] 

因爲你,你得到一個MemoryError反覆將列表添加到自身,導致您用盡RAM:P。

0
['frameinstance{}'.format(i) for i in range(0,41)] 
  1. 範圍(開始,結束)不包括結束range(0, 40)將在39
  2. 結束了,你需要建立一個列表不串,使用列表理解爲推薦。
4

的問題是,在這裏:

filenamelist = [str(filenamelist) + "frameinstance" + str(i)] 

filenamelist是一個列表,並str(filenamelist)會得到你該列表的字符串表示:括號[],周圍(使用repr)的字符串表示該列表中的每個項目。讓我們看看如何擴大:

[] 
['[]frameinstance0'] 
["['[]frameinstance0']frameinstance1"] 
['["[\'[]frameinstance0\']frameinstance1"]frameinstance2'] 
['[\'["[\\\'[]frameinstance0\\\']frameinstance1"]frameinstance2\']frameinstance3'] 
['[\'[\\\'["[\\\\\\\'[]frameinstance0\\\\\\\']frameinstance1"]frameinstance2\\\']frameinstance3\']frameinstance4'] 

糟糕。一個字符串的字符串表示包括它的引號,它們在某個點上必須被反斜線轉義。反斜槓也必須用另一個反斜槓轉義,導致指數反斜槓增長。讓我們來算一算:

  • 第三字符串表示有2個單引號和0反斜槓
  • 每一個新的迭代增加了2個單引號,1個反斜線每一個反斜槓,以及1個反斜線每一個單引號

在遍歷循環40次後,最終會得到一個包含2740億反斜槓的字符串列表,這些列表中有很多反斜槓適合內存。

這裏的問題是將列表轉換爲一個字符串來連接另一個字符串;你可能會將列表連接到一個列表而不是一個字符串到一個字符串。這是可行的:

filenamelist = filenamelist + ["frameinstance" + str(i)] 

通常情況下,雖然,你會用列表的append方法到位添加一個項目。

filenamelist.append("frameinstance" + str(i)) 

現在是要注意的是Python有一些有用的字符串格式化工具格式化數字(及以上)爲字符串的好時機:

"frameinstance%d" % (i,) 
"frameinstance{}".format(i) 
f"frameinstance{i}" # Python 3.6+ 

,並給出了一小段路,你」預覽將來可能會知道如何寫這篇文章!

filenamelist = [f"frameinstance{i}" for i in range(0, 40)]