特定のリストが別のリストのサブリストであるかどうかを確認し、True
またはFalse
:で返す小さなプログラムを作成しました。
def is_sublist_of(sublist, given):
""" Returns whether the sublist is part of the given combination.
The order of the sublist must also correspond to the order of the
corresponding part in the given combination."""
return sublist in [given[i:i+len(sublist)] for i in range(0,len(given)-len(sublist))]
このコードは私がしなければならない割り当ての一部ですが、与えられたアサートの1つは次のとおりです。
simple_list = [1, 2, 3, 4]
for element in simple_list:
assert is_sublist_of([element], simple_list)
assert not is_sublist_of([5], simple_list)
そして、私のプログラムはこのテストに失敗します。これは、私のプログラムが特別な場合に機能しないことを意味しますか?ご覧いただきありがとうございます。
はい。すべてのサブリストを生成するわけではありません。最後のサブリストは省略されます。とを与えるgiven = [1,2,3,4]
とsublist = [1]
、次のようになります。
>>> given = [1, 2, 3, 4]
>>> sublist = [1]
>>> [given[i:i+len(sublist)] for i in range(0,len(given)-len(sublist))]
[[1], [2], [3]]
(彼らは通常これを「1つのエラーでオフ」と呼びます)。
迅速な修正は次のようになります。
return sublist in [given[i:i+len(sublist)] for i in range(0,len(given)-len(sublist)+1)]
そう+1
の中でrange(..)
。
しかし、よりエレガントな解決策は次のとおりです。
def is_sublist_of(sublist, given):
n = len(sublist)
return any(sublist == given[i:i+n] for i in range(len(given)-n+1))
ここで、アルゴリズムはそのようなリストを見つけた瞬間から停止するため、すべてのサブリストを生成するわけではなく、そのうちの1つが一致するかどうかを確認します。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加