我刚开始使用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列表 - >我不会害怕尺寸的数量。
任何建议都将不胜感激。 谢谢。
答案 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]]]]
备注:a
为np.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