0

我有一系列列表,每个列表中有两个项目,称为 box1、box2、box3 等,我正在尝试附加到主列表以供以后访问。以下是我认为可行的方法,但事实并非如此。我认为这可能是append方法中的字符串添加到的东西i,但我不确定。

这显然只是添加字符串框 + i,但我需要找出一种方法来循环并将所有类似命名的项目添加到此列表中。实现这一目标的最佳方法是什么?

box1 = [1,2]
box2 = [3,4]
boxes = []

##Adding strings. I need to add box items instead.
for i in range(11):
    boxes.append("box" + str(i))

我想看看这个:

boxes = [[1,2],[3,4]]

仅供参考:由于我仅限于使用的软件,我不能为此使用导入的库。

4

7 回答 7

1
for i in range(11):
    box = locals().get('box' + str(i))
    if box is not None:
        boxes.append(box)

请注意,在我看来,重构代码会更好,这样box1box2就可以创建一个字典,然后执行类似box_dict['box1'] = [1, 2]. 这将允许您稍后通过名称轻松查找这些列表。

于 2013-06-14T16:09:45.520 回答
1

您可以使用eval(),在您的情况下,它将是:

boxes = [eval('box%d' %i) for i in range(1,3)]

如果您有一个包含要添加到框的框名称的列表,您可以简单地执行以下操作:

boxes = [eval(boxname) for boxname in boxnames]
于 2013-06-14T16:06:14.873 回答
0

您的问题类似于 Stack Overflow 问题Convert a string to preexisting variable names,但为了节省时间,您可以使用getattr(object, name)从对象中获取具有特定名称的变量。

你可能有类似的东西:

for i in range(11):
    boxes.append(getattr(self, "box"+i))
于 2013-06-14T16:08:55.293 回答
0

这应该有效:

box1 = [1,2]
box2 = [3,4]
boxes = []
##adding strings, need to add box items instead
for i in range(1,3):
    boxes.append(locals()["box" + str(i)])
于 2013-06-14T16:06:07.000 回答
0

这是一种相当糟糕的编码方式,但你可以这样做

import itertools

boxes=[]
for i in itertools.count(1):
    name='box{}'.format(i)
    if name not in locals():
       break
    boxes.append(locals()[name])

对于无库版本:

boxes=[]
i=1
while True:
    name='box{}'.format(i)
    if name not in locals():
       break
    boxes.append(locals()[name])
    i+=1
于 2013-06-14T16:06:35.390 回答
0

可以使用该vars()函数获取可用变量的字典:

box1 = [1,2]
box2 = [3,4]
boxes = []

##Adding strings. I need to add box items instead
for i in range(11):
    key = "box%d" % i
    if key in vars():
         boxes.append(vars()[key])
boxes

此外,您应该考虑检查globals().

于 2013-06-14T16:07:09.013 回答
0
 boxDict={}
 boxes=[]
 for i in range(1,11):
      box = [i, i+1]
      boxDict[i] = box
      boxes.append(box)
于 2013-06-14T16:07:27.287 回答