2013-02-13 97 views
13

我想将多个变量追加到列表中。变量的数量各不相同。所有变量都以“音量”开头。我在想也许是通配符或者什么都可以。但我找不到像这样的东西。任何想法如何解决这个问题?注意在这个例子中它是三个变量,但它也可以是五六个或任何其他的。将几个变量追加到Python中的列表中

volumeA = 100 
volumeB = 20 
volumeC = 10 

vol = [] 

vol.append(volume*) 
+1

它可以帮助如果你能给这是更接近你的情况的一个实例。也就是说,你是如何得到变量数目不明的变量的? – 2013-02-13 18:43:46

回答

13

您可以使用extend任何可迭代追加到一个列表:

vol.extend((volumeA, volumeB, volumeC)) 

根据您的变量名的前缀有一个坏的代码味道对我来说,但你可以做到。 (中值附加的顺序是不确定的。)

vol.extend(value for name, value in locals().items() if name.startswith('volume')) 

如果顺序很重要(恕我直言,仍然气味错):

vol.extend(value for name, value in sorted(locals().items(), key=lambda item: item[0]) if name.startswith('volume')) 
4

虽然你可以做

vol = [] 
vol += [val for name, val in globals().items() if name.startswith('volume')] 
# replace globals() with locals() if this is in a function 

一个更好的方法是使用一个字典,而不是类似命名的变量:

volume = { 
    'A': 100, 
    'B': 20, 
    'C': 10 
} 

vol = [] 
vol += volume.values() 

注意,在后一种情况下,为了的项目是未指定的,即您可以获得[100,10,20][10,20,100]。要添加项目中键的顺序,使用方法:

vol += [volume[key] for key in sorted(volume)] 
+1

+1;如果你有一堆变量的名字是按某种顺序排列的,那么你几乎肯定是做错了。 – geoffspear 2013-02-13 18:55:04

+1

变量来自其他计算(我没有在这里发布)。如果我使用字典,我有问题先把它们放到字典中。 – ustroetz 2013-02-13 19:00:33

3

编辑从列表中移除理解为filter它强调指出,这是一个惊人的想法。

我改变了它,所以它不太相似,所有其他的答案。

volumeA = 100 
volumeB = 20 
volumeC = 10 

lst = map(lambda x : x[1], filter(lambda x : x[0].startswith('volume'), globals().items())) 
print lst 

输出

[100, 10, 20] 
+3

一个理解过滤器调用让我很难过...... – JBernardo 2013-02-13 18:36:14

+0

你的评论让我意识到我是多么的错误:D - 明天微笑是情人节。 – sotapme 2013-02-13 18:37:55

+0

为了继续使用'filter',切换到使用'map'更加丑陋。我认为JBernardo的观点是,理解已经有了一个可选的if语句内置的,所以使用它来代替'filter'。 – 2013-02-13 19:33:12

0

你要添加的变量名,以及他们的价值?

output=[] 

output.append([(k,v) for k,v in globals().items() if k.startswith('volume')]) 

或只值:

output.append([v for k,v in globals().items() if k.startswith('volume')])