リスト内のサブリストの開始インデックスと終了インデックスを検索します

2013年07月26日に質問されました。  ·  閲覧回数 10.7k回  ·  ソース

David Y. Stephenson picture
2013年07月26日

私はリストを持っています:

greeting = ['hello','my','name','is','bob','how','are','you']

このリストのサブリストの最初と最後のインデックスを見つける関数を定義したいと思います。 したがって:

find_sub_list(['my','name','is'], greeting)

戻る必要があります:

1, 3

提案?

回答

dawg picture
2013年07月26日
15

複数の一致が必要な場合、これは機能します。

greeting = ['hello','my','name','is','bob','how','are','you','my','name','is']

def find_sub_list(sl,l):
    results=[]
    sll=len(sl)
    for ind in (i for i,e in enumerate(l) if e==sl[0]):
        if l[ind:ind+sll]==sl:
            results.append((ind,ind+sll-1))

    return results

print find_sub_list(['my','name','is'], greeting) 
# [(1, 3), (8, 10)]

または、最初の一致が必要な場合:

greeting = ['hello','my','name','is','bob','how','are','you','my','name','is']

def find_sub_list(sl,l):
    sll=len(sl)
    for ind in (i for i,e in enumerate(l) if e==sl[0]):
        if l[ind:ind+sll]==sl:
            return ind,ind+sll-1

print find_sub_list(['my','name','is'], greeting)    
# (1, 3)
Blender picture
2013年07月26日
0

リストをスライスします。

>>> greeting[0:3]
['hello', 'my', 'name']
>>> greeting[1:4]
['my', 'name', 'is']
>>> greeting[1:4] == ['my','name','is']
True

これで始められるはずです:

for n in range(len(greeting) - len(sub_list) + 1):
    ...
mbdavis picture
2013年07月26日
-1

リストが常にサブリストに含まれることが確実な場合は、次のようにすることができます。

def find_sub_list(sub_list,this_list):
    return (this_list.index(sub_list[0]),len(sub_list))

サブリスト内のアイテムがリストに存在することを確認する場合は、以下を使用します。

def find_sub_list(sub_list,this_list):
    if set(sub_list).issubset(set(this_list)): 
        return(this_list.index(sub_list[0]),len(sub_list))
    else:
        return False

最後に、sub_list内のアイテムの順序も不明になる場合は、次を使用します。

def find_sub_list(sub_list,this_list):
    if sub_list[0] in this_list:
        for i,item in enumerate(sub_list[1:]):
            if item not in this_list[this_list.index(sub_list[i]):]:
                return False
        return(this_list.index(sub_list[0]),len(sub_list))

ここで、関数がfalseを返さないようにするには、項目を正しい順序にする必要があります。

Francis picture
2018年01月29日
-2

最初と最後のエントリのインデックスのみを返す場合の解決策は次のとおりです。

def find_sub_list(subl, l):
    ind_subl = [i for i in range(len(l)) if l[i] in subl]
    return [ind_subl[0], ind_subl[-1]]

print find_sub_list(['my', 'name', 'is'], greeting)
# [1, 3]