检查列表是否列表并在python中相应迭代

时间:2014-11-30 23:45:09

标签: python list nested-lists

我不得不处理列表或列表列表。我发现我当前的方法效率不高,因为我必须定义两个单独的方法来处理并有效地将它们写出两次。是否有更有效的方法来检查传入的数据是否是列表或列表列表,然后相应地进行(我通常希望对每个传入数据项执行操作并输出与传入数据的结构匹配的列表或列表列表) 。这是我处理它的一个例子:

if not any(isinstance(item, list) for item in keys):
    userStrings = []
    for key in keys[index]:
        userStrings[index].extend(item.GetUserStrings().GetValues(key))
else:
    userStrings = [[] for i in range(len(rhObjects))]
    for index, item in enumerate(rhObjects):
        for key in keys[index]:
            userStrings[index].extend(item.GetUserStrings().GetValues(key))

如果我遇到一些更复杂的东西,如果它列出了一系列列表等等。这种方法不起作用...想法?

谢谢!

这似乎不够清楚。让我们重新开始吧。想象一下,我有一个列表列表,一个列表,甚至是一个对象列表列表:

_list = [["X","Y","Z"],["X","Y","Z",["X","Y","Z"]],["X","Y","Z"]]
_list2 = ["X","Y","Z"]
_list3 = [["X","Y","Z"],["X","Y","Z"]]

我想做的就是从这些列表中对每个对象执行一个简单的函数(附加" A"到每个对象)或者创建一个全新的对象,但其方式与原始输入的结构相匹配名单。示例功能:

   def my_function(obj):
       return obj + "A"
   def my_function2(obj):
       return newObj

期望的输出:

_newList = [["XA","YA","ZA"],["XA","YA","ZA",["XA","YA","ZA"]],["XA","YA","ZA"]]
_newList2 = ["XA","YA","ZA"]
_newList3 = [["XA","YA","ZA"],["XA","YA","ZA"]]

或者如果使用了my_function2:

_newList = [["newObj","newObj","newObj"],["newObj","newObj","newObj",["newObj","newObj","newObj"]],["newObj","newObj","newObj"]]

有没有办法像以下用户一样使用两个功能?一个递归?我是递归的总菜鸟,你在顶部看到的第一种方法是我检查列表中的列表的方式,但它真的不灵活。所有/任何帮助表示赞赏!

1 个答案:

答案 0 :(得分:2)

您的逻辑应该采用单独的方法,您应该使用recursion

def process_list(_list):
    new_list = []
    for x in _list:
        if is_list(x):
            new_list.append(process_list(x))
        else:
            new_list.append(map(lambda y: y + "A",x))
    return new_list

def is_list(l):
    return type(l) == types.ListType

_list = [["X","Y","Z"],["X","Y","Z",["X","Y","Z"]],["X","Y","Z"]]
print(process_list(_list))
print(_list)

代码只是为了演示递归。希望你能得到它并同样构建你的代码。