将顺序对象添加到列表的语法

时间:2012-11-17 20:44:14

标签: python list

非常初学的问题,但这让我很生气。 sample1,sample2等是Pygame.mixer.sound对象。

sample_list = []
sample_list.append(sample1)
sample_list.append(sample2)
sample_list.append(sample3)

很好,但我想使用for style循环,例如

for j in range(1, 3, 1):
    sample_list.append(sample + j)

但是这是试图在声音对象上添加一个数字,所以不对。我可以添加等效的字符串;

for j in range(1, 3, 1):
    sample_list.append("sample" + str(j))

但是这并没有引用我想要的对象,只是添加了这些字符串。 我已经尝试过我能想到的语法排列,但它仍然暗指着我! 感谢。

4 个答案:

答案 0 :(得分:3)

首先不要将对象存储在变量中;将它们直接存储到列表中,然后您就可以用整数对它们进行索引。

如果整数标识符是稀疏的,请使用整数索引的dict

答案 1 :(得分:2)

我建议将这些存储在dict中。通过名称引用几乎相同的效果,但每个引用没有明确的对象符号:

samples = {
    "sample1": Sample(),
    "sample2": Sample()
}
samples['sample3'] = Sample()

当您创建动态数量的对象并希望以后能够通过名称抓取它们时,这是首选方法。你可以在你的dict中存储100个这些,而不会弄乱你的命名空间。

稍后如果您尝试将此应用于循环,则可以引用字符串名称:

for i in xrange(1,4):
    sample_list.append(samples["sample" + str(i)])

作为旁注,当他们居住在某个对象上时,另一种通过名称获取属性的方法是使用getattr。假设你有这个:

class Sampler(object):
    pass

sampler = Sampler()
sampler.sample1 = Sample()
sampler.sample2 = Sample()
sampler.sample3 = Sample()

然后您可以通过名称来引用:getattr(sampler, "sample1")

注意:如@Marcin的评论中所述,如果您不关心字符串标识符是否能够查找您的项目,并且它们只是按编号顺序排列,那么您可以使用相同的方法,但使用列表。这取决于你的需求。

您可能希望最终执行以下操作:

samples = {
    "bang1": Sample(),
    "bang2": Sample(),
    "bang3": Sample(),
    "shot1": Sample(),
    "shot2": Sample(),
    ...
}

...然后,您可以查找这些声音的连续子集。

答案 2 :(得分:0)

您可以从locals() mapping

动态加载变量
for j in range(1, 4):
    sample_list.append(locals()["sample" + str(j)])

一般来说,你想避免这种伎俩;找到将sample变量存储在映射或列表中的其他方法。

答案 3 :(得分:-2)

看起来是错误的做法,但不过。

sample_list = [eval('sample' + str(i)) for i in range(1, 4)]