开发者

Python: List to tuple without "

I am trying to use the Abaqus (a commercial FEA code) scripting interface to generate FE models, although my question is relating to Python specifically, but a bit of background on why I am trying to do this.

Abaqus has a built in boolean merge operation that requires the following syntax to be used:

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

The 'instances' parameter is specified as a tuple where each element is of the format

a.instances['string1']

I am trying to make it so that the number of elements within this tuple, and obviously the names within it are scriptable. Cu开发者_Go百科rrently I have code which looks like:

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

However, this gives:

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

I have tried using lstrip and rstrip to remove the " characters but to no avail. Is there a way of generating a tuple of arbitrary length where the elements are not enclosed in inverted commas? The format is specified by the Abaqus interface, so there is no alternative format that can be used.

Many Thanks


You're close, try:

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

You can make this even shorter using a generator expression:

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


Those characters will be printed out simply because you're printing out a tuple - that means strings will be quoted, so you can see the difference between (123,) and ("123",). If you want to have it without quotes, construct the output yourself:

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

Edit: I thought you actually wanted to generate the code itself, not create tuple in the current code. If generating a tuple in current code is what you actually want to do, just use tuple(a.instances['name_' + str(i)] for i in range(n))

Edit2: Actually, you could check the library you're working with. Unless it specifically tests for tuples for some reason, it accept lists just fine, since the interface for both is pretty much the same. If it does, you could just pass it [a.instances['name_' + str(i)] for i in range(n)] as a parameter and be done.

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜