[英]Filling a list in Python
我是Python的新手。 我正在嘗試使用文件夾中一堆圖像的文件名來填充列表。 它們都以“ frameinstance”開頭,然后是0-40之間的數字,即“ frameinstance0.png”。 我嘗試了下面的代碼,但出現MemoryError
錯誤。
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)
輸出為: []
基本列表理解:
filenamelist = ["frameinstance{}".format(i) for i in range(41)]
在第一個代碼中,您總是通過將filenamelist
的值轉換為越來越長的字符串來更改filenamelist
的值,這最終會導致MemoryError
。 有關更多信息,請查看Ryan的答案 ,尤其是為什么第二個代碼中沒有發生。
在第二個代碼中,將[]
放在filenamelist
,然后將其與"frameinstance" + str(i)
,因此,在每次迭代時, "frameinstancei"
在該字符串的末尾連接"frameinstancei"
。 您最后得到的字符串以"[]"
開頭,后跟"frameinstancei"
40次。
幾件事:
append
方法。 通常,編寫filenamelist.append("frameinstance{}".format(i))
而不是filenamelist = ...
"blah" + str(x) + "blah"
打印字符串被認為是不推薦的。 而是使用format
方法: "blah{}blah".format(x)
。 range(n)
為您提供0
到n-1
整數。 因此,您的呼叫應該是range(0,41)
而不是range(0,40)
,並且可能只是range(41)
。 問題是在這里:
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']
哎呀。 字符串的字符串表示形式包括其引號,必須在某些時候使用反斜杠轉義。 反斜杠還必須與另一個反斜杠一起轉義,從而導致指數反斜杠增長。 讓我們做一下數學:
經過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)]
您需要將對象添加到列表中
filenamelist = []
i = 0
for i in range(0,40):
filenamelist.append("frameinstance" + str(i))
您的第一遍真的很接近。 需要考慮的幾件事:
您不需要初始化filenamelist
或i
。
您可以使用列表filenamelist = ["frameinstance{}".format(i) for i in range(41)]
將for循環放入列表構造filenamelist = ["frameinstance{}".format(i) for i in range(41)]
list filenamelist = ["frameinstance{}".format(i) for i in range(41)]
['frameinstance{}'.format(i) for i in range(0,41)]
range(0, 40)
將以39結尾 嘗試這個:
filenamelist = []
for i in range(41):
filenamelist.append("frameinstance%s.png" % i)
或更高級的pythonic(並且更快,因為循環在python中很慢):
filenamelist = ["frameinstance%s.png" % i for i in range(41)]
之所以收到MemoryError,是因為您將列表反復添加到自身中,從而導致RAM:P用完。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.