我是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)
输出为:[]frameinstance0frameinstance1frameinstance2frameinstance3frameinstance4frameinstance5frameinstance6frameinstance7frameinstance8frameinstance9frameinstance10frameinstance11frameinstance12frameinstance13frameinstance14frameinstance15frameinstance16frameinstance17frameinstance18frameinstance19frameinstance20frameinstance21frameinstance22frameinstance23frameinstance24frameinstance25frameinstance26frameinstance27frameinstance28frameinstance29frameinstance30frameinstance31frameinstance32frameinstance33frameinstance34frameinstance35frameinstance36frameinstance37frameinstance38frameinstance39
答案 0 :(得分: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)
会为您提供从0
到n-1
的整数。因此,您的来电应该是range(0,41)
而不是range(0,40)
,而且可能只是range(41)
。答案 1 :(得分:4)
问题在于:
filenamelist = [str(filenamelist) + "frameinstance" + str(i)]
filenamelist
是一个列表,str(filenamelist)
将为您提供该列表的字符串表示形式:括号[
和]
,围绕字符串表示形式(使用{{3}该列表中的每个项目。让我们来看看它是如何扩展的:
[]
['[]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)]
答案 2 :(得分:0)
您需要将对象添加到列表中
filenamelist = []
i = 0
for i in range(0,40):
filenamelist.append("frameinstance" + str(i))
答案 3 :(得分:0)
你的第一次传球非常接近。需要考虑的一些事项:
您无需初始化filenamelist
或i
。
您可以使用列表推导将for循环放在列表构造filenamelist = ["frameinstance{}".format(i) for i in range(41)]
答案 4 :(得分:0)
['frameinstance{}'.format(i) for i in range(0,41)]
range(0, 40)
将以39 答案 5 :(得分:-1)
试试这个:
filenamelist = []
for i in range(41):
filenamelist.append("frameinstance%s.png" % i)
或更pythonic(更快,for循环在python中很慢):
filenamelist = ["frameinstance%s.png" % i for i in range(41)]
你得到了一个MemoryError,因为你正在迭代地将列表添加到自身,导致你的RAM耗尽:P。