2016-10-29 6 views
0
def separate(p : callable, l : [object]) -> ([object],[object]): 
    z = [] 
    d = [] 
    for item in l: 
     if p(item): 
      z + [item] 
      new_l = l.pop(item) 
      separate(p,new_l) 
     else: 
      d + [item] 
      new_l = l.pop(item) 
      separate(p,new_l) 
    h = tuple((z,d)) 
    return h 

関数が述語とリストを渡しました。 0タプルは、述語がTrueを返す引数リスト内のすべての値のリストであり、1インデックスは、述語がFalseを返す引数リスト内のすべての値のリストである2タプルを返します。 +を使用してリストを連結することはできますが、リストを変更することはできません(たとえば、追加するコールがないなど)。関数が述語を取り、リストがタプルを返す

別々の呼び出し((ラムダX:X> = 0)、[1、-3、-2,4,0、-1,8])は

([1,4,0,8],[-3,-2,-1]). 

を返します。しかし、私はなぜわかりません誰かがそれを修正する方法を教えてくださいすることができます

*Error: s = separate(predicate.is_positive,[1, -3, -2, 4, 0, -1, 8]) raised exception TypeError: 'int' object is not iterable 

:?私の関数は、私が得た

'int' object is not iterable 

エラーは以下のとおりであることを私にエラーを与えますかどうもありがとう。

+0

:あなたが意図的に再帰を導入仮定すると、のは再考し、解決策を簡素化してみましょうその引数の反復可能ではなく整数です。また、 'z + [item]'と 'd + [item]'行は、自分が行っていると思っていることをしていません。 – TigerhawkT3

+0

変更方法がわかりません。 – zeyuxie

+3

@zeyuxie **ここに自分の投稿を破壊することはありません!**サイトに滞在する価値がないと思う場合は、単に削除してください。 –

答えて

2

このコードを再帰的または反復的に解決している場合、コードは決定していないようです。両方のビットがあります。あなたが渡しているようですので、

def separate(predicate: callable, array: [object]) -> ([object], [object]): 
    positive, negative = list(), list() 

    if array: 
     if predicate(array[0]): 
      positive.append(array[0]) 
     else: 
      negative.append(array[0]) 

     p, n = separate(predicate, array[1:]) 

     positive += p 
     negative += n 

    return positive, negative 

例私は 'L'で、一回の反復を参照してください

> python3 -i test.py 
>>> separate((lambda x: x >= 0), [1, -3, -2, 4, 0, -1, 8]) 
([1, 4, 0, 8], [-3, -2, -1]) 
>>> separate((lambda x: x % 2 == 0), [1, -3, -2, 4, 0, -1, 8]) 
([-2, 4, 0, 8], [1, -3, -1]) 
>>> 
関連する問題