2017-01-06 166 views
0

我是Python新手。我试图用文件夹中一堆图像的文件名来填充列表。它们都以“frameinstance”开始,然后是0-40之间的数字,即“frameinstance0.png”。我尝试了下面的代码,但我得到一个MemoryError错误。在Python中填充列表

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

回答

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

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

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

您是非常接近你的第一关。有几件事情要考虑:

  1. 你不需要初始化filenamelisti

  2. 您可以使用列表中理解把for循环的列表构造内filenamelist = ["frameinstance{}".format(i) for i in range(41)]

-1

试试这个:

filenamelist = [] 
for i in range(41): 
    filenamelist.append("frameinstance%s.png" % i) 

或者更Python(快,for循环是蟒蛇缓慢):

filenamelist = ["frameinstance%s.png" % i for i in range(41)] 

因为你,你得到一个MemoryError反复将列表添加到自身,导致您用尽RAM:P。

0
['frameinstance{}'.format(i) for i in range(0,41)] 
  1. 范围(开始,结束)不包括结束range(0, 40)将在39
  2. 结束了,你需要建立一个列表不串,使用列表理解为推荐。
4

的问题是,在这里:

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