Знаходжанне дакладнага становішча меншага спісу ўнутры спісу (пітон)

Таму ў мяне ёсць спіс, які з'яўляецца чымсьці накшталт гэтага:

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]

І тады я таксама подсписок, які выглядае прыкладна так:

<�Код> подсписок = [9.9, 9.9, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8, 9.8]

Цяпер тое, што мне трэба рабіць з гэтым меншым спісам, з'яўляецца тое, што я павінен знайсці, дзе гэта знаходзіцца ў галоўным спісе. Так што ў гэтым выпадку вынік павінен быць нешта накшталт гэтага: індэкс = 119 (я мог бы быць выключаны з +/- 1)

Я спрабаваў зрабіць гэта ўвесь дзень ... І не знайшоў нічога ў Інтэрнэце ... У мяне ёсць некалькі ідэй:

1) Я лічу, першы элемент подсписка ў спісе .... які ў гэтым выпадку будзе 4, таму я праверыць наступны нумар, які таксама з'яўляецца правільным, то наступным, які будзе няправільным і пасылаў яго, каб знайсці іншыя 9,9 у пакінутым спісе [4:] і зрабіце тое ж цыкл зноў ... пакуль дакладнае супадзенне не знойдзена

2) Тады іншая ідэя заключаецца ў тым, каб нейкім чынам выкарыстаць радкі вул (спіс) [1: -1] .find (вул (подсписок) [1: -1]), што ў гэтым выпадку дасць адказ на 687 ...

Праблема з гэтымі ідэямі ў тым, што яны, здаецца, доўга і неакуратна, а таксама я не быў у стане зрабіць гэтыя ідэі працуюць ...

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'

Гэта друкуе знойдзены ў пазіцыі 118 .

пастскрыптум Я пераназваў зменныя, так што спіс <�код /> ня цень убудаванай функцыі.

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
дададзена

Ваша другая ідэя можа даць ілжывы станоўчы вынік: калі Подсписок было адно значэнне, скажам, 1, і поўны спіс меў толькі значэнне 11, то знайшлі б матч. Калі вы дадалі пачатковыя і канчатковыя падзельнікі ў вашай радку, гэта можна было б пазбегнуць.

Ваша першая ідэя знаходзіцца на паўдарозе да аптымальнага рашэння; існуе алгарытм (імя якога выслізгвае ад мяне ў дадзены момант) для вызначэння таго, колькі падрадка вы можаце «паўторна выкарыстоўваць», так што вы ніколі не павінны вяртацца назад у поўнай радку. Напрыклад, выкажам здагадку, што ваш цяперашні кандыдат не ўдалося, таму што вы знайшлі 9,9, дзе вы чакалі 9,8; Вам не трэба паўторна гэта элемент, паколькі ён супадае з першым элементам падрадка. Такімі могуць быць папярэдне вылічаныя, так што вы ў канчатковым выніку проста ішоў поўны спіс за адзін праход.

1
дададзена
Межжали думка на першым ... добры прыклад .. Другі павінны працаваць да я думаю ... Дзякуй за адказ ..
дададзена аўтар Artur Käpp, крыніца