2

リストにリストがあります。

興味のある項目が含まれているかどうかを調べたい。

For example: L=[['READ',[A,B],'2'],['WRITE',[C,D],'2']]

今、私は文字列を持っています、私はstr=READそのような要素が存在するかどうかを見つけるためにサブリストを含む2つのリストを繰り返したいと思います。インデックスを使用せずにそれを行う方法はありますか?

リストの長さが同じままであるという保証がないため、インデックス作成を使用したくありません。

4

2 に答える 2

2

検索対象のデータ構造にループがない場合、これは単純な再帰的な問題です。

def find(x, L):
    return x in L or any(find(x, sublist)
                         for sublist in L
                         if isinstance(sublist, list))

代わりに、データ構造にループが存在する可能性がある場合は、無限再帰に入らないように保護する必要があります

def find(x, L, seen=None):
    if seen is None:
        seen = set()
    if id(L) in seen:
        # Avoid infinite recursion
        return False
    seen.add(id(L))
    return x in L or any(find(x, sublist, seen)
                         for sublist in L
                         if isinstance(sublist, list))
于 2013-09-22T09:28:04.513 に答える
2

一般的な平坦化関数の使用:

import collections
def flatten(l):
    for el in l:
        if isinstance(el, collections.Iterable) and not isinstance(el, basestring):
            for sub in flatten(el):
                yield sub
        else:
            yield el

リストを平坦化して、READ が含まれているかどうかを確認できます。

>>> 'READ' in flatten(L)
True
于 2013-09-22T09:23:14.767 に答える