如何从任意结构的所有叶节点中删除多余的空格

时间:2014-09-13 16:37:33

标签: python list python-2.7

下面的代码似乎遍历了结构,但是当它从travrse_it返回时,传递的结构没有被修改。叶子是不可变的,所以我假设我需要返回它。有人可以在这里指出我做错了什么:

r = ['crossABC', ['A', 'B', 'C'], ['r       n   w   ', 'r       n   r   ', 'r       n   n ', 'n      w           w   ', 'n      w           r ', 'n      w      n', 'n      r    w   ', 'n      r    r  ', 'n      r    n  ', 'n      n   w   ', 'n      n   r ', 'n      n   n  ']]

rm_space = lambda x: re.sub('\s+', ' ', x)

def traverse_it(it, str_func):
  if (isinstance(it, list)):
    for item in it:
      traverse_it(item, str_func)
  elif (isinstance(it, dict)):
    for key in it.keys():
      traverse_it(it[key], str_func)
  elif ( isinstance(it, basestring) ):
    return str_func(it)
  else:
    print "Cant travers unkown item"

traverse_it(r,rm_space)

预期产出:

r = ['crossABC', ['A', 'B', 'C'], ['r n w ', 'r n r ', 'r n n ', 'n w w ', 'n w r ', 'n w n', 'n r w ', 'n r r ', 'n r n ', 'n n w ', 'n n r ', 'n n n ']]

1 个答案:

答案 0 :(得分:1)

简单地返回值不会影响项目。您需要返回返回值。代码还需要返回listdict类型。

def traverse_it(it, str_func):
    if isinstance(it, list):
        for i, item in enumerate(it):
            it[i] = traverse_it(item, str_func)
        return it
    elif isinstance(it, dict):
        for key in it:
            it[key] = traverse_it(it[key], str_func)
        return it
    elif isinstance(it, basestring):
        return str_func(it)
    else:
        print "Cant travers unkown item"