リストの中の小さなリストの正確な位置を見つける(python)

だから私はこのようなものがリストを持っている:

list=[10.0, 10.0, 10.0, 9.9, 9.9, 9.9, 10.0, 9.9, 10.0, 10.0, 10.0, 10.0, 9.9, 9.9, 9.9, 9.9, 9.9, 9.9, 10.0, 10.0, 10.0, 10.2, 10.0, 9.9, 9.9, 9.9, 9.9, 10.0, 10.2, 10.0, 9.9, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.1, 10.0, 10.0, 10.0, 10.0, 10.0, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.2, 10.2, 10.2, 10.2, 10.2, 10.2, 10.2, 10.2, 10.2, 10.3, 10.3, 10.2, 10.2, 10.3, 10.3, 10.2, 10.2, 10.2, 10.2, 10.2, 10.2, 10.3, 10.2, 10.5, 10.9, 10.5, 10.3, 10.3, 10.3, 10.2, 10.2, 10.2, 10.2, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.4, 10.7, 10.3, 10.2, 10.1, 10.1, 10.0, 10.0, 10.0, 10.0, 10.0, 9.9, 9.9, 9.9, 10.0, 9.9, 9.9, 9.9, 10.1, 9.9, 9.9, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.7, 9.8, 9.8, 9.7, 9.7, 9.7, 9.7, 9.7, 9.7, 9.6, 9.7]

そして、次のようなサブリストもあります:

sublist = [9.9、9.9、9.8、9.8、9.8、9.8、9.8、9.8、9.8、9.8]

今私がこの小さなリストで行う必要があるのは、メインリストにある場所を見つけなければならないということです。 この場合、結果は次のようになります:index = 119(私は+/- 1でオフになるかもしれません)

私は一日中これをやろうとしていました...そして、ウェブ上で何も見つけられません... 私はいくつかのアイデアを持っています:

1)リストの最初の項目がリストにあります。この場合は4となりますので、次の数字も正しいことを確認してから、次の数字が間違っていて、別の番号を探して送信します残りのリスト[4.:]に9.9を入力し、完全な一致が見つかるまで同じループを再度実行します

2)次に別のアイデアは何とか文字列を使うことです この場合、687の答えを返すstr(list)[1:-1] .find(str(sublist)[1:-1])...

これらのアイデアの問題は、それらが長くて醜いと思われ、私はこれらのアイデアを機能させることができていないということです。

2

4 答え

どのように:

l = [10.0, 10.0, 10.0, 9.9, 9.9, 9.9, 10.0, 9.9, 10.0, 10.0, 10.0, 10.0, 9.9, 9.9, 9.9, 9.9, 9.9, 9.9, 10.0, 10.0, 10.0, 10.2, 10.0, 9.9, 9.9, 9.9, 9.9, 10.0, 10.2, 10.0, 9.9, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.0, 10.1, 10.0, 10.0, 10.0, 10.0, 10.0, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.2, 10.2, 10.2, 10.2, 10.2, 10.2, 10.2, 10.2, 10.2, 10.3, 10.3, 10.2, 10.2, 10.3, 10.3, 10.2, 10.2, 10.2, 10.2, 10.2, 10.2, 10.3, 10.2, 10.5, 10.9, 10.5, 10.3, 10.3, 10.3, 10.2, 10.2, 10.2, 10.2, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.1, 10.4, 10.7, 10.3, 10.2, 10.1, 10.1, 10.0, 10.0, 10.0, 10.0, 10.0, 9.9, 9.9, 9.9, 10.0, 9.9, 9.9, 9.9, 10.1, 9.9, 9.9, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.7, 9.8, 9.8, 9.7, 9.7, 9.7, 9.7, 9.7, 9.7, 9.6, 9.7]
subl = [9.9, 9.9, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8]
for i in xrange(len(l)-len(subl)):
  if l[i:i+len(subl)] == subl:
    print 'found at pos', i
    break
else:
  print 'not found'

これは pos にあるを出力します。

P.S. list が組み込み関数をシャドーしないように変数の名前を変更しました。

3
追加された
うわー!それは華麗です!本当に、これはまさに私が必要としていたものです...それはシンプルですが仕事もしています...あまりにも悪いことに私はこれを考えませんでしたありがとう!
追加された 著者 Artur Käpp,
ind = l.index(subl[0])
for i in xrange(l.count(subl[0])-1):
    if l[ind:ind+len(subl)] == subl:
        print (ind)
        break;
    ind = l.index(subl[0],ind+1)

これは、少なくとも subl の最初の値が存在することがわかっている場合にのみ比較する効率的な方法です。

2
追加された
idx = next(i for i in range(len(lst)-len(sublst)) if lst[i:i+len(sublist)] == sublst)
# 118
1
追加された

2番目のアイデアは偽陽性をもたらす可能性があります。サブリストが単一の値、たとえば1で、完全なリストの値が11の場合は、一致すると見なされます。文字列に先頭と末尾の区切り文字を追加した場合は、これを避けることができます。

あなたの最初のアイデアは最適な解決策の半分です。あなたが完全な文字列でバックトラックする必要がないように、あなたが "再利用"することができる部分文字列の量を決定するためのアルゴリズム(その名前は現時点では私を逃しています)があります。たとえば、あなたが9.8を予想したところで9.9を見つけたために現在の候補が失敗したとします。部分文字列の最初の要素と一致するため、その要素を再訪する必要はありません。それらはあらかじめ計算されているので、1回のパスで完全なリストを歩くだけで終わります。

1
追加された
最初のものに絡み合って考える...良い例.. 2番目のものはうまくいくはずです...私は答えます...ありがとうございました。
追加された 著者 Artur Käpp,