在Python中将几个变量添加到列表中

18

我想将几个变量附加到列表中,变量的数量是不确定的。所有变量都以"volume"开头。我在想也许通配符或者类似的东西可以做到这一点。但我找不到类似的东西。有什么想法解决这个问题吗?请注意,在这个例子中有三个变量,但它也可能是五个、六个或任何数量。

volumeA = 100
volumeB = 20
volumeC = 10

vol = []

vol.append(volume*)

1
如果您能提供一个更贴近您情况的例子,可能会有所帮助。例如,您是如何得到一些变量数量不确定且名称未知的变量的? - Jon-Eric
5个回答

18

您可以使用 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'))

如果列表中已经有一些元素怎么办?我尝试了一下,但是出现了错误 TypeError: 'int' object is not iterable - Boruto Uzumaki

6
尽管您可以这样做
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;如果你有一堆变量,它们的名称按某种顺序排列,那么你几乎肯定做错了。 - Wooble
1
变量的结果来自其他计算(我没有在这里发布)。如果我要使用字典,我首先要将它们放入字典中。 - ustroetz

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]

你的评论让我意识到我是多么的错误 :D - 明天是情人节,微笑起来吧。 - sotapme
使用map只是为了继续使用filter,这样做甚至更加丑陋。我认为JBernardo的观点是,推导式已经内置了可选的if子句,因此应该使用它来代替filter - Jon-Eric
情人节前夕,我以为爱情应该在空气中弥漫,显然并不是盲目的爱情。:/ 你当然是对的,而且我理解了JBernardo的观点,但是我不想给出一个“我也这么认为”的回答,相反我选择在缺乏吸引力方面保持一致性。 - sotapme

2

您是否想添加变量名称以及它们的值?

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

1
如果我理解得正确,您正在尝试将不同变量中的不同值附加到列表中。让我们看下面的示例。 假设:
email = 'example@gmail.com'
pwd='Mypwd'

list = []

list.append(email)
list.append (pwd)

for row in list:
      print(row)

 # the output is :
 #example@gmail.com
 #Mypwd

希望这能帮到你,谢谢。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接