簡體   English   中英

填寫Python列表

[英]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)為您提供0n-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']

哎呀。 字符串的字符串表示形式包括其引號,必須在某些時候使用反斜杠轉義。 反斜杠還必須與另一個反斜杠一起轉義,從而導致指數反斜杠增長。 讓我們做一下數學:

  • 第三個字符串表示形式具有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)]

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

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

您的第一遍真的很接近。 需要考慮的幾件事:

  1. 您不需要初始化filenamelisti

  2. 您可以使用列表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)]
  1. range(start,end)不包括end range(0, 40)將以39結尾
  2. 您需要構造一個不是字符串的列表,建議使用列表理解。

嘗試這個:

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.

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