使用for函数通过列表挖掘列表

时间:2019-06-19 15:49:01

标签: python list

在执行的函数中,我有一个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语句数?

3 个答案:

答案 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);
         });
     }
}