我有一个服务器,该服务器以多维数组的格式访问和获取数据,因此最终结果是:
[
[
[n1t1:1, n1s1:2, n1o1:5],
[n1t2:3, n1s2:8, n1o2:9]
],
[
[n2t1:9, n2s1:3, n2o1:2],
[n2t2:5, n2s2:1, n2o2:7]
],
[
[n3t1:4, n3s1:9, n3o1:2],
[n3t2:7, n3s2:1, n3o2:5]
]
]
我需要遍历该数组,仅访问s1值并将它们存储到将作为结果返回的新数组中。
选项1:
result = []
parent_enum = 0
while len(array) > parent_enum:
child_enum = 0
result.append([])
while len(child_enum) > array_num:
result[parent_enum].append(array[parent_enum][child_enum][1])
child_enum += 1
parent_enum += 1
选项2:
result = [[] for i in range(len(array))]
parent_enum = 0
while len(array[0]) > parent_enum:
child_enum = 0
while len(array) > child_enum:
result[child_enum].append(array[child_enum][parent_enum][1])
child_enum += 1
parent_enum += 1
有区别吗?如果有的话,哪种方法会更有效,更快捷?考虑到第二维的尺寸最大为20,而第三维的尺寸最大为500
答案 0 :(得分:2)
以下代码应使用内置函数更易读,并具有良好的性能。
data = [ ...your data... ]
result = map(lambda first: # for each first-level entry
map(lambda second: # for each second-level entry within first
second[1], # return the second value
first
),
data
)
[
[
2,
8
],
[
3,
1
],
[
9,
1
]
]
答案 1 :(得分:2)
为什么不使用简单的列表理解:
arr = [
[
["n1t1:1", "n1s1:2", "n1o1:5"],
["n1t2:3", "n1s2:8", "n1o2:9"]
],
[
["n2t1:9", "n2s1:3", "n2o1:2"],
["n2t2:5", "n2s2:1", "n2o2:7"]
],
[
["n3t1:4", "n3s1:9", "n3o1:2"],
["n3t2:7", "n3s2:1", "n3o2:5"]
]
]
result = [[arr_lev3[1] for arr_lev3 in arr_lev2] for arr_lev2 in arr]
print(result)
示例输出:
[['n1s1:2', 'n1s2:8'], ['n2s1:3', 'n2s2:1'], ['n3s1:9', 'n3s2:1']]
它比map
方法快2倍以上:
In [38]: %timeit result = [[arr_lev3[1] for arr_lev3 in arr_lev2] for arr_lev2 in arr]
753 ns ± 2.24 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
In [39]: %timeit result2 = list(map(lambda first: list(map(lambda second: second[1], first)), arr))
1.63 µs ± 20.4 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)