如何在给定“源代码”字符串列表的情况下创建数组组合字符串?

时间:2018-12-01 06:01:47

标签: arrays algorithm python-2.7 recursion dynamic

基本上,我会得到一个字符串列表,例如:

["structA.structB.myArr[6].myVar",
"structB.myArr1[4].myArr2[2].myVar",
"structC.myArr1[3][4].myVar",
"structA.myArr1[4]",
"structA.myVar"]

这些字符串描述了来自多个结构的变量/数组。数组中的整数描述每个数组的大小。给定一个字符串具有一个/多个数组(1d或2d),我想生成一个字符串列表,该列表通过该字符串的数组中的每个索引组合。我曾考虑过使用for循环,但是问题是在运行脚本之前,我不知道给定字符串中有多少个数组。所以我不能做类似的事情

for i in range (0, idx1):
    for j in range (0, idx2):
         for k in range (0, idx3):
               arr.append(“structA.myArr1[%i][%i].myArr[%i]” %(idx1,idx2,idx3))

但是问题是我不知道如何基于多少索引以及如何创建动态追加语句来创建多重/动态for循环,因为每个字符串都将具有原始列表中的每个字符串而变化不同数量的索引,并且数组将位于字符串的不同位置。

我能够编写一个正则表达式来找到我的字符串列表中每个字符串的所有索引:

indexArr = re.findall('\[(.*?)\]', myString)
//after looping, indexArr = [['6'],['4','2'],['3','4'],['4']]

但是,我真正地坚持如何实现“动态for循环”或为此使用递归。我想让我的字符串结尾列表看起来像这样:

[
["structA.structB.myArr[0].myVar",
"structA.structB.myArr[1].myVar",
...
"structA.structB.myArr[5].myVar”],

[“structB.myArr1[0].myArr2[0].myVar",
"structB.myArr1[0].myArr2[1].myVar",
"structB.myArr1[1].myArr2[0].myVar",
…
"structB.myArr1[3].myArr2[1].myVar”],

[“structC.myArr1[0][0].myVar",
"structC.myArr1[0][1].myVar",
…
"structC.myArr1[2][3].myVar”],

[“structA.myArr1[0]”,
…
"structA.myArr1[3]”],

[“structA.myVar”] //this will only contain 1 string since there were no arrays
]

我真的很固执,不胜感激。非常感谢。

1 个答案:

答案 0 :(得分:2)

关键是使用itertools.product生成一组范围的所有可能组合,并将它们替换为适当构造的字符串模板的数组索引。

import itertools
import re
def expand(code):
    p = re.compile('\[(.*?)\]')
    ranges = [range(int(s)) for s in p.findall(code)]
    template = p.sub("[{}]", code)
    result = [template.format(*s) for s in itertools.product(*ranges)]
    return result

expand("structA.structB.myArr[6].myVar")的结果是

['structA.structB.myArr[0].myVar',
 'structA.structB.myArr[1].myVar',
 'structA.structB.myArr[2].myVar',
 'structA.structB.myArr[3].myVar',
 'structA.structB.myArr[4].myVar',
 'structA.structB.myArr[5].myVar']

expand("structB.myArr1[4].myArr2[2].myVar")

['structB.myArr1[0].myArr2[0].myVar',
 'structB.myArr1[0].myArr2[1].myVar',
 'structB.myArr1[1].myArr2[0].myVar',
 'structB.myArr1[1].myArr2[1].myVar',
 'structB.myArr1[2].myArr2[0].myVar',
 'structB.myArr1[2].myArr2[1].myVar',
 'structB.myArr1[3].myArr2[0].myVar',
 'structB.myArr1[3].myArr2[1].myVar']

和极端情况expand("structA.myVar")自然可以产生

['structA.myVar']