用Python填充列表
我是Python新手。我试图用文件夹中一堆图像的文件名填充一个列表。它们都以“frameinstance”开头,然后后跟0-40之间的数字,即“frameinstance0.png”。我尝试了下面的代码,但是我得到了一个用Python填充列表,python,list,python-3.x,for-loop,Python,List,Python 3.x,For Loop,我是Python新手。我试图用文件夹中一堆图像的文件名填充一个列表。它们都以“frameinstance”开头,然后后跟0-40之间的数字,即“frameinstance0.png”。我尝试了下面的代码,但是我得到了一个MemoryError错误 filenamelist = [] i = 0 for i in range(0,40): filenamelist = [str(filenamelist) + "frameinstance" + str(i)] 我也试过这个。我的输出很接近,
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)
输出为:
[]frameinstance0frameinstance1frameinstance2frameinstance3frameinstance4frameinstance5frameinstance6frameinstance7frameinstance8frameinstance9frameinstance10frameinstance11frameinstance12frameinstance13frameinstance14frameinstance15frameinstance16frameinstance17frameinstance18frameinstance19frameinstance20frameinstance21frameinstance22frameinstance23frameinstance24frameinstance25frameinstance26frameinstance27frameinstance28frameinstance29frameinstance30frameinstance31frameinstance32frameinstance33frameinstance34frameinstance35frameinstance36frameinstance37frameinstance38frameinstance39
,具有基本的列表理解:
filenamelist = ["frameinstance{}".format(i) for i in range(41)]
在第一个代码中,您总是通过将
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)
提供从0
到n-1
的整数。因此,您的呼叫应该是范围(0,41)
而不是范围(0,40)
,并且可以是范围(41)
您需要将对象添加到列表中
filenamelist = []
i = 0
for i in range(0,40):
filenamelist.append("frameinstance" + str(i))
你的第一次传球非常接近。需要考虑的几件事:
您不需要初始化文件名列表
或i
您可以使用列表理解将for循环放入列表构造中filenamelist=[“frameinstance{}”.format(i)for i in range(41)]
试试这个:
filenamelist = []
for i in range(41):
filenamelist.append("frameinstance%s.png" % i)
或者更具python风格(更快,因为python中的循环速度较慢):
您得到了一个MemoryError,因为您正在迭代地将列表添加到它本身,导致RAM:p耗尽
['frameinstance{}'.format(i) for i in range(0,41)]
范围(开始、结束)不包括结束范围(0、40)
将在39结束
您需要构造一个列表而不是字符串,建议使用列表理解
问题在于:
filenamelist = [str(filenamelist) + "frameinstance" + str(i)]
filenamelist
是一个列表,str(filenamelist)
将获得该列表的字符串表示:括号[
和]
,围绕该列表中每个项目的字符串表示(使用)。让我们看看它是如何扩展的:
[]
['[]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 = [f"frameinstance{i}" for i in range(0, 40)]