用Python填充列表

用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)] 我也试过这个。我的输出很接近,

我是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
,具有基本的列表理解:

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)]