2016-04-28 11 views
1

以前は、要素がネストされたリストに存在するかどうかを調べるための質問があり、以下のリンクでその応答を得ました。多次元リスト内の要素を検索し、サブリスト番号を返すか?

Search of Element inside a multi-dimensional List Not Working. Any Clue

機能が同様にサブリストは要素が存在していると言う値を出すことができれば不思議でしたか?下記の要素が終了する場合やないと言うのコードです:

def in_nested_list(item, x): 
    if not isinstance(x, list): 
     return x == item 
    else: 
     return any(in_nested_list(item, ix) for ix in x) 

list1 = [] 
list1.append([['red'], ['blue'], ['bla']]) 

print list1 

list1.append([['hello'], ['blue'], ['bla']]) 
print list1 

if in_nested_list('hello', list1): 
    print "Found Hello" 
else: 
    print "Not Found Hello" 

は私が特定の上に基づいて、さらにデータを追加できるように、また、サブリストは、要素の終了をしていると言ってその機能を変更することができますどのように思っていましたサブリスト。

a。上の例から、if条件はHelloが見つかったことを表示します。しかし、それはまた、上記の場合にsublist_no、すなわちサブリスト1のような出力変数を返すか、または保存すると、さらに変数を追加できるようになります。

例:出力がTRUEになり、サブリスト番号も1になります。そのため、関数呼び出し後に次の処理を実行できます。私は要素の赤を検索する場合、私は第一のリストにいくつかのより多くの変数を追加することができるように

list1[sublist_no].append(['Bug']) 

が言うには、出力は、0としてsublist_noでTRUEになります。 list1[sublist_no].append('[Rasberry]') # i.e. onto the first sub-list.

上記クエリのヒントはありますか?親切にあなたの元の関数は、リストのちょうどリストよりもはるかに複雑なネストされた構造を扱うことができますので...あなたのコメントに

答えて

0

をドロップするので、あなたのネストされた「index」関数はず:

def in_nested_list(item, x): 
    if item == x: 
     return [] 
    if isinstance(x, list): 
     for i, ix in enumerate(x): 
      r = in_nested_list(item, ix) 
      if r != -1: 
       return [i] + r # highest level index plus path in sublist 
    return -1 # not found in any (nested) sublist 

# if not found at all: return -1 
# if item == x: return [] 
# else: return [a, b, c] such that item == x[a][b][c] 

> in_nested_list(3, [[1, 2], [3, 4]]) 
[1, 0] 

> in_nested_list(3, [[1, 2], [[5, 3], 4]]) 
[1, 0, 1] 

> in_nested_list(3, 3) 
[] 

> in_nested_list(3, [1, 2]) 
# -1 

は、これはあなたがすることができますあなたが選んだ任意の入れ子レベルで物を追加してください。あなたの質問については、単純な構造のサブリストのインデックスはin_nested_list(...)[0](存在する場合は、そうでない場合はエラー)になります。

+0

ご回答Schwobasegglためのおかげで..私は例を実行しようとしたが、何とかそのループエラーに入る: ファイル「./listeg_sch.py​​」、8行目を、in_nested_list X = in_nested_list(アイテム、IX) ファイル」に./listeg_sch.py​​ "、in_nested_listの第4行 if item == x: RuntimeError:最大再帰深度がcmpを超えました 私はちょっと答えました。 – Vimo

+0

私の答えは少し編集しました。しかし、私は参照してください。ストリング自体は反復可能ですが、私はintでテストしました。いくつかの微調整が行います。私に分かります;) – schwobaseggl

+0

これでうまくいくはずです! – schwobaseggl

0

私はあなたの機能を変更するために力を入れました。

def in_nested(item, container): 
    if not isinstance(container, list): 
     raise TypeError 
    for elem in container: 
     if isinstance(elem, list): 
      found = in_nested(item, elem) 
      if not found: 
       pass 
      elif isinstance(found, bool): 
       # Item is present in this list 
       return elem 
       # List containing item is present in this container 
       # Comment above return to use it. 
       return container 
      else: 
       # Return the deepest list and not the most outer list containing it. 
       return found 
     else: 
      return item == elem 


_input = [[['red'], ['blue'], ['bla']], [['hello'], ['blue'], ['bla']]] 
out = in_nested('hello', _input) 
if out: 
    print "Found Hello", out 
else: 
    print "Not Found Hello" 

out.append('new') 
print 'Added new to original input', _input 

out = in_nested('Hello', _input) # hello with capital H 
if out: 
    print "Found Hello", out 
else: 
    print "Not Found Hello" 

# Prints: 
# Found Hello ['hello'] 
# Added new to original input [[['red'], ['blue'], ['bla']], [['hello', 'new'], ['blue'], ['bla']]] 
# Not Found Hello 

注:アイテムが存在する場合は、ターゲットリスト自体が表示されます。リストを再度検索する必要はありません。結果に追加するだけです。

+0

あなたの応答のためにおかげで安心..これは基本的に内側のほとんどのリスト自体を返しています..私はまた内側のリスト番号を取得できますか?そんな感じ ?たとえば、上記のシナリオでは、内側のリスト番号は1です。なぜなら、 'hello'は2番目の内側のリストに存在するからです。 – Vimo

+0

あなたの要件に応じて、なぜリスト番号が必要なのか分かりません。しかし、あなたがそれを必要とするなら、@ schwobasegglのようなアプローチはもっと理にかなっています。 –

+0

こんにちはAnshu ..真実あなたが与えたケースを実行したとき、それは基本的に内部リスト自体に追加します: [[['red']、['blue']、['bla']]、[['第2の内部リストの最後にnew要素を追加する代わりに、 の[hello]、[new]]、['blue']、['bla']]]を使用します。 [[['red']、[' ['bla']、['new']]] これまでの内部リストの中で、存在する要素が見つかったリストの最後にいくつかの要素を追加したいのですが、リスト自体の中にではなく、内部リスト番号を探していただけなので、何かを追加することができます。 _input [1] .append(['' new '])そしてさらにいくつかの変数 – Vimo

関連する問題