如何处理通过数组或列表中未知数量的索引循环

时间:2013-08-16 03:16:01

标签: python regex arrays recursion

对于这个例子,我有一个包含变量名称的文件,例如foo或bar [4] [5],其中名称可能有也可能没有可变数量的索引,因为变量可能是多维数组。字典里面还有每个变量的起始内存地址,以及它的值类型,例如int_32或signed_int_64等。

我的程序应该打印出每个变量,任何数组的每个组件,其内存地址及其值。问题是,我该如何处理数组?它们可以是一维的,二维的,十二维的,甚至是零维的(单值),但我需要用一个程序来完成它们。另一个重要因素是使程序足够稳健以承受任何数量的维度。

3 个答案:

答案 0 :(得分:1)

我的解决方案是取名称并检查它是否与另一个stackoverflow用户提供的正则表达式匹配。以下代码应记入Lib。

    def getEntryName(var_string) : # From   LIB @   Stackoverflow.com
      result = re.search(r'(.*?)((?:\[\d*])*)$', var_string)
      var_name = result.group(1)
      numbers   =   re.findall(r'\[(\d+)]', result.group(2))
      return var_name, numbers

这将返回变量的基本名称和名为“numbers”的列表,其中包含所有数组的所有索引。

现在我使用了一个recurvise调用来查找迭代任意数量的索引!

def BracketHandler( PassedRange, var_name, var_Length, var_startA, numbers )
  for i in range( 0, int( PassedRange ) - 1 ) : # We cycle through it!
    if numbers : # If there are more indexes to cycle through,
      BracketHandler( numbers[0], var_name + "[" + str( i ) + "]",
                    var_Length,  var_startA, numbers[1:] )
    else: # Exit Condition
      ProcessVar(var_name + "[" + str( i ) + "]",

var_Length,var_startA)           var_startA + = var_length

现在解释我的代码。基本上,在运行此函数之前,我检查以确保数字中有任何内容,如果有,我将这个递归函数传递给数字中的第一个值,变量的名称,长度和起始地址以及最后的其余数字(哪个mich = [])一旦那里,我遍历当前索引。接下来我检查集合中是否有更多数字,如果有,我将当前索引添加到名称上,然后再次运行该函数,直到没有新数字为止。

此时,由于没有新的数字,我处理另一个函数中的变量,并启动起始地址。并且中提琴!

如果此代码采用类似foo的名称和一组数字,如[4,6,8],它将产生:

foo[0][0][0]
foo[0][0][1]
...
foo[0][0][7]
foo[0][1][0]
...
foo[3][5][7]

并将所有内容发送给正确的值进行处理!

可能有更好的解决方案,但我找不到任何解决方案。为了让它尽可能地发挥作用,我对它进行了长时间的修改,虽然对某些人来说似乎很明显,但当时这一点并不那么明显。如果您有任何改进建议,我欢迎它。如果我所做的任何错误,请随时编辑我的错误。如果这不是做Q& A的合适方式,请告诉我,我会删除它!

答案 1 :(得分:1)

另一种可能性是使用itertools.product代替递归来获取所有坐标。对于(例如)[1,3,4]的数字,您基本上需要笛卡尔积[{1}},这正是[0] x [0,1,2] x [0,1,2,3]的用途:

例如:

itertools.product

(请注意,>>> from itertools import product >>> numbers = [1, 3, 4] >>> product(*(range(n) for n in numbers)) <itertools.product object at 0x101abb640> >>> list(product(*(range(n) for n in numbers))) [(0, 0, 0), (0, 0, 1), (0, 0, 2), (0, 0, 3), (0, 1, 0), (0, 1, 1), (0, 1, 2), (0, 1, 3), (0, 2, 0), (0, 2, 1), (0, 2, 2), (0, 2, 3)] 基本上是f(*(a,b,c))。)

将整个事物包装成发电机:

f(a,b,c)

会给我们

def all_coords(name, numbers):
    coords = product(*(range(n) for n in numbers))
    for coord in coords:
        yield name + ''.join('[{}]'.format(c) for c in coord)

答案 2 :(得分:0)

使用 np.ndenumerate 。例如:

for ind,value in np.ndenumerate(myarray):
    print ind, value

将循环遍历数组,将ind作为元组,一维数组为(i,),2D为(i,j),3D为(i,j,k)等等...,您可以访问始终从数组中检索的数据,如:

`myarray[ind]`

允许您对任何数组进行一般循环...