在python中使用2D列表的优雅方式

时间:2017-11-03 06:21:52

标签: python python-2.7 numpy

我刚开始使用Python 2.7几个月了。我通常在Python中使用一些2D列表,这是一项简单的任务,但我想知道在Python 2.7中我是否有更优雅的方法来完成同样的工作?

这是我的任务。我有一个2D列表:

my_list = [["__cat_1", "__cat_2"],
           ["__cat_3", "__cat_4"]]

我想将上面的二维字符串列表转换为二维整数列表。

expected_result = [[1, 2], [3, 4]]

像往常一样,我做如下:

def convert_2D_string_list(my_list):
    for a_group in my_list:
        yield [int(k.replace("__cat_","")) for k in a_group]

但是,当我的输入有3个维度时,上述内容无效:

my_second_list = [[["__cat_1", "__cat_2"], "__cat_12"],
                  [["__cat_3", "__cat_4"], "__cat_34"]]

如果我的输入列表是integer,我知道转换它的优雅方式。例如:

def convert_2D_int_list:
    my_list = [[1, 2], [3, 4]]
    import numpy as np
    # Assume that, I want to add 1 for each of element

    # Convert to numpy array
    my_list = np.asarray(my_list)
    my_list += 1

    # my_list = [[2, 3], [4, 5]]
    return my_list

我的convert_2D_string_list方法的最佳做法是什么? 所以如果它不是2D列表,而是3D列表 - >我不会害怕尺寸的数量。

任何建议都将不胜感激。 谢谢。

4 个答案:

答案 0 :(得分:2)

Numpy数组与NUMbers的效果非常好,对字符串来说有点棘手。 np.vectorize是针对这种情况的解决方案,即使没有完成性能提升。但它管理任意数量的尺寸,希望你会发现它优雅。

a=np.array([[[['__cat_0', '__cat_1'],
         ['__cat_2', '__cat_3']],

        [['__cat_4', '__cat_5'],
         ['__cat_6', '__cat_7']]],


       [[['__cat_8', '__cat_9'],
         ['__cat_10', '__cat_11']],

        [['__cat_12', '__cat_13'],
         ['__cat_14', '__cat_15']]]])


def f(str): return int(str[6:])        
fv=np.vectorize(f)

print(fv(a))

给出:

[[[[ 0  1]
   [ 2  3]]

  [[ 4  5]
   [ 6  7]]]


 [[[ 8  9]
   [10 11]]

  [[12 13]
   [14 15]]]]    

备注:anp.vectorize(lambda n : '__cat_'+str(n))(np.arange(16).reshape((2,)*4));)

答案 1 :(得分:2)

在递归复制列表的同时修改值。

def visit(fn, xs):
    return [visit(fn, x) if isinstance(x, list) else fn(x) for x in xs]

在这种情况下,修改函数fn类似于:

    def categorize(s):
        return int(re.match(r'__cat_(\d*)', s).group(1))

测试这个:

my_second_list = [[["__cat_1", "__cat_2"], "__cat_12"],
              [["__cat_3", "__cat_4"], "__cat_34"]]

print visit(categorize, my_second_list)

输出:

> [[[1, 2], 12], [[3, 4], 34]]

答案 2 :(得分:0)

您可以使用地图和列表推导将字符串2D列表转换为int 2D列表

my_list = [["__cat_1", "__cat_2"],["__cat_3", "__cat_4"]]    
my_list = [map(lambda z: int(z.split('_')[-1]), ls) for ls in my_list]
print my_list # [[1,2],[3,4]]

3d列表:

my_list = [["__cat_1", "__cat_2", '__cat_3'],["__cat_1", "__cat_2", '__cat_3']]
my_list = [map(lambda z: int(z.split('_')[-1]), ls) for ls in my_list]
print my_list # [[1,2,3],[1,2,3],[1,2,3]]

答案 3 :(得分:0)

我希望这对你有用:

admin/admin_page/change_password