将list.map应用于python

时间:2015-08-26 15:35:51

标签: python ironpython

我有两个并行的列表嵌套列表。它们总是在长度和子长度上匹配。例如:

_list1 = [[1,2,3],[1,2],[1,2,3,4]]
_list2 = [[a,b,c],[a,b],[a,b,c,d]]

现在无法保证上述结构。我可能会获得一个平面列表甚至更深的嵌套列表。为此目的,如果我想将定义应用于该列表中的每个元素,我使用list.map和递归,如下所示:

def ProcessList(_func, _list):
    return map( lambda x: ProcessList(_func, x) if type(x)==list else _func(x), _list )

这样我可以将单个定义应用于未指定的嵌套列表。我怎么能同时做两个并列的列表呢?我想应用一个定义,它将从_list1中获取一个元素,而对于_list2中的匹配元素,它将执行一个定义。例如:

def DoSomething(i,j);
    return str(i) + str(j)

因此,如果我将这个定义并行应用于两个列表,它将返回:

_newList = [[1a,2b,3c],[1a,2b],[1a,2b,3c,4d]]

同样,重点是能够在未指定的列表和嵌套列表上运行。

1 个答案:

答案 0 :(得分:4)

你的意思是这样的:

>>> def ProcessList(_func, *lists):
...     return map( lambda *xs: ProcessList(_func, *xs) if all(type(x) is list for x in xs) else _func(*xs), *lists )
... 
>>> def DoSomething(*args):
...     return ''.join(map(str, args))
... 
>>> _list1 = [[1,2,3],[1,2],[1,2,3,4]]
>>> _list2 = [['a','b','c'],['a','b'],['a','b','c','d']]
>>> 
>>> print (ProcessList(DoSomething, _list1, _list2))
[['1a', '2b', '3c'], ['1a', '2b'], ['1a', '2b', '3c', '4d']]