2015-04-28 29 views
0

我有两个嵌套列表(列表列表)和一个嵌套的True/False(模式)列表,我想用它们从两个输入列表中选择项目创建最终名单。从两个嵌套列表中选择并使用Python模式选择

inputListTrue = [[1,1,1],[2,2,2],[3,3,3]] 
inputListFalse = [[a,a,a],[b,b,b],[c,c,c]] 
pattern = [[True, False, True],[True, True, True],[False, False, True]] 

finalDesiredList = [[1,a,1],[2,2,2],[c,c,3]] 

什么是创建一个定义,将在嵌套列表中的任何深度合作的最有效方式.... [[[],[]],[]]等等。我一直在寻找的东西,不像我只是迭代的最初的想法真的很灵活:

for i, j, k in zip(pattern, inputListTrue , inputListFalse): 
    for l,m,n in zip(i,j,k): 
     if l: 
      finalDesiredList .append(m) 
     else: 
      finalDesiredList .append(n) 

这只适用于列表列表,不适用于列表列表等。想法?

+0

也许[ ''filter()''](https://docs.python.org/2/library/functions.html#filter)会有所帮助。 – pzp

+0

列表中的元素是否始终相等? – Kasramvd

+0

我不明白你对'任何嵌套列表的深度'的要求。你能举一个完整的例子吗?也许[扁平列表](http://stackoverflow.com/questions/952914/making-a-flat-list-out-of-list-of-lists-in-python)是可以看的东西。 – Marein

回答

2

下面是任意嵌套的序列

为此
def choose(first, second, value): 
    if hasattr(first, '__iter__'): 
     return [choose(i,j,k) for i,j,k in zip(first, second, value)] 
    else: 
     return first if value else second 

>>> inputListTrue = [[1,1,1],[2,2,2],[3,3,3]] 
>>> inputListFalse = [['a','a','a'],['b','b','b'],['c','c','c']] 
>>> pattern = [[True, False, True],[True, True, True],[False, False, True]] 
>>> choose(inputListTrue, inputListFalse, pattern) 
[[1, 'a', 1], [2, 2, 2], ['c', 'c', 3]] 

这假设序列都具有尺寸相同的递归方法。

+0

OP正在寻找一种具有更多维度的数组的通用方法! – Kasramvd

+0

@Cyber​​是的,我一直在寻找更多的尺寸解决方案。感谢您的输入! – konrad

1

您也可以使用一个递归函数更通用方式:

def filt(pattern, inputListTrue , inputListFalse ,finalDesiredList=[]) : 
     for i, j, k in zip(pattern, inputListTrue , inputListFalse): 
      temp=[] 
      for l,m,n in zip(i,j,k): 

       if isinstance (l,list): 
        return filt(i,j,k) 
       else : 
       if l: 
         temp .append(m) 
       else : 
         temp .append(n) 
      finalDesiredList.append(temp) 
     return finalDesiredList 



inputListTrue = [[1,1,1],[2,2,2],[3,3,3]] 
inputListFalse = [['a','a','a'],['b','b','b'],['c','c','c']] 
pattern = [[True, False, True],[True, True, True],[False, False, True]] 

print filt(pattern, inputListTrue , inputListFalse) 
[[1, 'a', 1], [2, 2, 2], ['c', 'c', 3]] 
+0

是的,这个工作,但我仍然需要添加一个检查,以确定它是否是一个平面列表,然后再进入两个后续的“for循环”。否则,它会在平面列表上抛出一个错误。 – konrad

+0

@konrad你没有提到这件事!我会更新答案! – Kasramvd

0
def filtFlat(pattern, inputListTrue, inputListFalse): 
    result = [] 
    for i, j, k in zip(pattern, inputListTrue, inputListFalse): 
     if i == False: 
      result.append(k) 
     else: 
      result.append(j) 
    return result 

def filt(pattern, inputListTrue , inputListFalse) : 
    finalDesiredList=[] 
    for i, j, k in zip(pattern, inputListTrue , inputListFalse): 
     temp=[] 
     for l,m,n in zip(i,j,k): 
      if isinstance (l,list): 
       return filt(i,j,k) 
      else: 
       if l: 
        temp.append(m) 
       else: 
        temp.append(n) 
     finalDesiredList.append(temp) 
    return finalDesiredList 

我总是可以使用这两个定义,并做了简单列表进行检查:

if any(isinstance(item, list) for item in pattern):