1

list1 が list2 に含まれているかどうかを確認する必要があります。また、リストにその順序で表示されるかどうかも確認する必要があります。true の場合は true を返し、そうでない場合は false を返します。

def check(lst1, lst2):
for x in lst1:
    for y in lst2:
        xx = lst1.sort()
        yy = lst2
        if xx != yy:
            return False
        else:
            return True

for ループと混同しています。また、コードを修正するためにここからどこに行けばよいかわかりません。ポインタをください?

それが何をすべきかの例:

  check([4,0],[9,1,4,6,8,9])
  True
  check([1,2],[2,3,1])
  False
4

3 に答える 3

3

問題は再帰的に解決することを懇願していると思ったので、次のようにしました。

def check(needle, haystack):
  if not needle:
      return True
  try:
    offset = haystack.index(needle[0])
    return check(needle[1:], haystack[offset+1:])
  except:
    return False

編集:

簡単な説明:

最初に、探しているリストが空かどうかを確認します (これは、自分自身を呼び出し始めると重要です)。すべてのリストには空のリストが含まれているため、True を返します。次に、探しているリストの最初の項目を探しています。見つかった場合は、関数を再度呼び出しますが、引数を少し変更します。「針」の最初のアイテムを既に見て、「干し草の山」でそれを見ました。そのため、残りの 'needle' が 'haystack' の残りに含まれているかどうかを確認する必要があります。したがって、両方のリストの残りの部分のみを使用して関数を再度呼び出します。needle の残りの部分は最初の要素以外のすべてであり、haystack の残りの部分は、見つかった要素の後のすべての項目です。最初のリストが空になったら、それは干し草の山で見つかったことを意味します。

于 2011-02-28T22:50:13.320 に答える
1

次のようなものから始めることができます。

set(lst1).issubset(lst2)

順序を無視して、lst1 が lst2 内に含まれているかどうかを確認します。一方のリストが他方のリストに含まれているというテストに合格した場合は、次のようなことができます。

ii = lst2.index(lst1[0])
if lst2[ii:ii+len(lst1)] == lst1:
   return True
else:
   return False

最初に、最初のチェックは 2 番目のチェックには無関係であると述べましたがValueError、lst1 の最初の要素が lst2 にない場合は適切に処理する必要があります。

編集: 補足として、私のコードと yan のバージョンを比較したところ、ほとんどすべてのユースケースで、特に len(lst1) が大きい場合 (yan の実装に対して最大 200 倍のスピードアップ)、私のコードの方が大幅に高速です。timeitモジュールで試してみてください。

def check(lst1,lst2):
    try:
        ii = lst2.index(lst1[0])
    except ValueError:
        return False

    if lst2[ii:ii+len(lst1)] == lst1:
        return True
    else:
        return False 

それがどのように機能するかの説明として、の最初の要素に一致するii = lst2.index(lst1[0])のインデックスを見つけます。そのアイテムが欠落している場合、 をキャッチしてを返します。その要素が存在する場合は、一致した要素から開始して次の要素を取得するサブリストとすべてを比較します。 lst2lst1lst2ValueErrorFalselst2[ii:ii+len(lst1)] == lst1lst1lst2len(lst)

于 2011-02-28T22:55:55.877 に答える
0
>>> a=[9,1,4,6,8,9]
>>> by_twos=zip(a, a[1:])
>>> by_twos
[(9, 1), (1, 4), (4, 6), (6, 8), (8, 9)]
>>> (4,6) in by_twos
True
于 2011-02-28T22:54:28.533 に答える