在Python中将列表项分配给变量
我刚接触Python,想找个方法把列表里的项目分配到单独的变量里。这样做的目的是为了在Blender中把每个项目显示为文本对象。我现在有的代码是这样的,但我知道一定有更有效的方法来实现这个。
file = open('lyrics.conf')
data = file.read()
file.close()
b = data.split('/')
v = len(b)
if v >= 1:
v1 = b[0]
if v >= 2:
v2 = b[1]
if v >= 3:
v3 = b[2]
if v >= 4:
v4 = b[3]
if v >= 5:
v5 = b[4]
if v >= 6:
v6 = b[5]
if v >= 7:
v7 = b[6]
if v >= 8:
v8 = b[7]
if v >= 9:
v9 = b[8]
if v >= 10:
v10 = b[9]
6 个回答
5
通过 b
,你已经有了一个很方便的列表,里面是你想要的项目。只需要在需要的时候,通过它们的索引 b[0], b[1], ...
来访问就可以了。把太多的变量放进命名空间,而这些变量的值其实可以很简单地存放在一个容器里,这在我看来是一种设计缺陷。
这里有一种方法可以把新的变量注入到当前模块的命名空间,但这是一种不好的做法:
#!/usr/bin/env python
import sys
somelist = range(10)
for i, item in enumerate(somelist):
setattr(sys.modules[__name__], 'v{0}'.format(i), item)
print v1 + v2
# => 3
print v1 * v2 * v3 * v4 * v5 * v6 - v7 * v8 - v9 + 11
# => ...
6
如果你真的想要单独的变量,某个时候你至少得做个拆包,比如 v1,v2,v3,v4,v5,v6,v7,v8,v9,v10 = some_list
。
但是你为什么要这么做呢?如果某样东西是一堆集合或列表,最好还是把它表示成一个集合或列表。
1
要逐条处理一组经文,可以这样做:
with open('lyrics.conf') as f:
data = file.read()
verses = data.split('/')
def build_blender_object(verse):
# Put meaningful code here
pass
blender_objects = [build_blender_object(v) for v in verses]
然后你可以对这些blender对象随意操作。如果列表中的位置很重要,你可以使用enumerate()来给每个blender对象加上一个索引,这样就能知道它们在列表中的位置了。