用Python填充列表

时间:2017-01-06 02:19:44

标签: 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)]

我也尝试过这个。我的输出很接近,但它不是一个列表。

filenamelist = []
i = 0

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

print(filenamelist)

输出为:[]frameinstance0frameinstance1frameinstance2frameinstance3frameinstance4frameinstance5frameinstance6frameinstance7frameinstance8frameinstance9frameinstance10frameinstance11frameinstance12frameinstance13frameinstance14frameinstance15frameinstance16frameinstance17frameinstance18frameinstance19frameinstance20frameinstance21frameinstance22frameinstance23frameinstance24frameinstance25frameinstance26frameinstance27frameinstance28frameinstance29frameinstance30frameinstance31frameinstance32frameinstance33frameinstance34frameinstance35frameinstance36frameinstance37frameinstance38frameinstance39

6 个答案:

答案 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)会为您提供从0n-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']

糟糕。字符串的字符串表示形式包括其引号,在某些时候必须使用反斜杠转义。反斜杠也必须使用另一个反斜杠进行转义,从而导致指数反斜杠增长。我们来算一算:

  • 第三个字符串表示有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)]

答案 2 :(得分:0)

您需要将对象添加到列表中

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

答案 3 :(得分:0)

你的第一次传球非常接近。需要考虑的一些事项:

  1. 您无需初始化filenamelisti

  2. 您可以使用列表推导将for循环放在列表构造filenamelist = ["frameinstance{}".format(i) for i in range(41)]

答案 4 :(得分:0)

['frameinstance{}'.format(i) for i in range(0,41)]
  1. 范围(开始,结束)不包括结束range(0, 40)将以39
  2. 结束
  3. 你需要构建一个不是字符串的列表,建议使用list comprehension。

答案 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。