繁体   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