在执行的函数中,我有一个for x in range(y)
循环,该循环将创建一个内部具有x
列表深度的列表。
例如,在x=1
,它将创建[[a,b],[a,b]]
在x=2
,它将创建[[[a,b],[a,b]],[[a,b],[a,b]]]
我希望能够查看每个元素(每个a和b),例如使用x = 1做:
for small_list in list:
for element in small_list:
print(element)
但是我很难弄清楚,因为在每个不同的x值处,我都需要更改for语句的数量。因为x与我需要的for语句数成线性比例关系,是否有一种方法可以根据更改的x来更改列表的for语句数?
答案 0 :(得分:1)
您可以使用一遍又一遍地调用单个参数表达式来包装可迭代对象:
def wrap_iter(x):
return [x]
# then a function to recursively call f
def nums(f, x, rep):
while rep:
x = f(x)
rep-=1
return x
a = [[1,2], [1,2]]
nums(wrap_iter, a, 1)
[[[1, 2], [1, 2]]]
nums(wrap_iter, a, 0)
[[1, 2], [1, 2]]
答案 1 :(得分:1)
是否可以更改for语句的数量...
不。相反,您应该创建一个递归函数,即一个针对较小问题再次调用自身的函数,直到遇到某种“基本情况”为止。
您似乎正在寻找某种Tree Traversal函数;像这样的东西:
def print_tree(tree):
if isinstance(tree, list):
for x in tree:
print_tree(x) # calling itself for smaller problem
else:
print(tree) # base case
print_tree([[[1,2],[3,4]],[[5,6],[7,8]]])
答案 2 :(得分:1)
作为递归函数的替代方法,您还可以遍历保留您自己的堆栈的结构:
public scatterData = [{
"name" : "LQArray",
"series" : [{
"name" : "a",
"x" : 1,
"y" : 2,
"r" : 1
}]
}];
private updateTitleData() {
if(this.regionData && this.regionData.location_quotient){
this.scatterData["series"] = [];
this.jobTitles.forEach((value) => {
var newScatterData = [{
"name":value,
"x":parseFloat(this.regionData.x_axis[value]),
"y":parseInt(this.regionData.y_axis[value]),
"r":1
}];
this.scatterData["series"].push(newScatterData);
});
}
}