Python:将列表转换为元组而不带

3 投票
2 回答
8088 浏览
提问于 2025-04-16 16:58

我正在尝试使用Abaqus(一个商业有限元分析软件)的脚本接口来生成有限元模型。虽然我的问题主要和Python有关,但我想先给大家讲讲我为什么要这么做。

Abaqus有一个内置的布尔合并操作,需要使用特定的语法,格式如下:

a.InstanceFromBooleanMerge(name='name_string', instances=(
    a.instances['string1'], a.instances['string2'], 
    a.instances['string3'], ), originalInstances=SUPPRESS, 
    domain=GEOMETRY)

这里的'instances'参数是一个元组,元组里的每个元素都需要按照这个格式:

a.instances['string1']

我想让这个元组里的元素数量和名称可以通过脚本来设置。目前我写的代码是这样的:

my_list = []
for i in range(4):
    name = str('a.instances[\'')+str('name_')+str(i)+str('\']')
    my_list.append(name)
my_list = tuple(my_list)
print my_list

但是,这段代码的输出是:

("a.instances['name_0']", "a.instances['name_1']", "a.instances['name_2']",   
    a.instances['name_3']")

我尝试过用lstrip和rstrip来去掉引号,但没有成功。有没有办法生成一个长度不固定的元组,并且里面的元素不被引号包围?这个格式是Abaqus接口规定的,所以不能用其他格式。

非常感谢!

2 个回答

1

这些字符会被打印出来,是因为你在打印一个元组。元组里的字符串会被加上引号,这样你就能看到 (123,)("123",) 的区别。如果你想要没有引号的输出,可以自己构造输出内容:

def make_tuple_of(n):
    return '(' + ', '.join("a.instances['name_" + str(i) + "']" for i in range(n)) + ')'

补充:我原以为你是想生成代码,而不是在当前代码中创建元组。如果你确实想在当前代码中生成一个元组,可以使用 tuple(a.instances['name_' + str(i)] for i in range(n))

补充2:其实你可以检查一下你正在使用的库。除非它特别要求使用元组,否则它也能接受列表,因为这两者的接口基本上是一样的。如果是这样,你可以直接把 [a.instances['name_' + str(i)] for i in range(n)] 作为参数传进去,就可以了。

3

你已经很接近了,试试这个:

for i in range(4):
    val = a.instances["name_"+str(i)]
    my_list.append(val)

你可以用生成器表达式把它写得更简洁:

my_list = tuple(a.instances["name_"+str(i)] for i in range(4))

撰写回答