Jak znaleźć ciąg liczb w listach?

0

Czy istneje podobna funkcja dla list co jest w stringach (chodzi o find)
chcę przeszukać listy i odnajdować ciągi liczb nie jedną
To taki przykład , wiem wiem na pewno bardo łatwe ale szukam długi , jak by ktoś pomógł

lista_str='marek to dobry człowiek tot'
print(lista_str)
idx_slowa=lista_str.find('tot')
print(idx_slowa)
    # program odnajduje początkowy adres słowa tot 

lista_int=[12,23,24,25,65,64,63,]
idx_szukany=lista_int.index(24)
print(idx_szukany)
      #program odnajduje adres liczby 24

    #Tu jest moje pytanie , szukam ciągu nie jednej liczby , np: 25,65,64
idx_szukany=lista_int.index([25,65,64])
print(idx_szukany)
      # jest błąd

Bardzo dziękuje

2

Chyba lista nie ma na to gotowej metody, ale możesz sobie zakodzić:

def znajdz_indeks_ciagu(lst, ciag):
    for i in range(len(lst) - len(ciag) + 1):
        if lst[i:i + len(ciag)] == ciag:
            return i
    return None

# Przykład użycia
lista_wejsciowa = [12,23,24,25,65,64,63,]
ciag_do_znalezienia = [25,65,64]
indeks = znajdz_indeks_ciagu(lista_wejsciowa, ciag_do_znalezienia)

if indeks is not None:
    print(f"Indeks znalezionego ciągu {ciag_do_znalezienia} to: {indeks}")
else:
    print(f"Ciąg {ciag_do_znalezienia} nie został znaleziony w liście.")

Wynik:
Indeks znalezionego ciągu [25, 65, 64] to: 3

0

Bardzo ci dziękuje , tak myślałem że nie ma gotowej funkcji
Jeszcze raz dziękuje

0

A jest moze funkcja podobna do .count?
Chodzi o to że ona zwraca ile razy coś występuje
Ale nie zwraca na jakich indeksach to jest ?

   ilosc=lista.count('kolo kwadrat')
   print(ilosc)```

to zwraca 3 no dobra a jak bym chciał znaleśc indeks tych ciągów 'kolo kwadrat'

``` idx=lista.faind('kolo kwadrat')
nie daje nic
idx=lista.index('kolo kwadrat')
też 0 ```
1

Wyszukiwanie podsekwencji dokonuje się wyspecjalizowanym algorytmem takim jak algorytm Knutha-Morrisa-Pratta, które są wydajniejsze niż naiwne przeszukiwanie takie jak podał @Spine. Druga edycja książki Python receptury podaje następującą implementację:

def KnuthMorrisPratt(text, pattern):
    ''' Yields all starting positions of copies of subsequence 'pattern'
    in sequence 'text' -- each argument can be any iterable.
    At the time of each yield, 'text' has been read exactly up to and
    including the match with 'pattern' that is causing the yield. '''
    # ensure we can index into pattern, and also make a copy to protect
    # against changes to 'pattern' while we're suspended by `yield'
    pattern = list(pattern)
    length = len(pattern)
    # build the KMP "table of shift amounts" and name it 'shifts'
    shifts = [1] * (length + 1)
    shift = 1
    for pos, pat in enumerate(pattern):
        while shift <= pos and pat != pattern[pos-shift]:
            shift += shifts[pos-shift]
        shifts[pos+1] = shift
    # perform the actual search
    startPos = 0
    matchLen = 0
    for c in text:
        while matchLen == length or matchLen >= 0 and pattern[matchLen] != c:
            startPos += shifts[matchLen]
            matchLen -= shifts[matchLen]
        matchLen += 1
        if matchLen == length: yield startPos

Zastosowanie:

lista_wejsciowa = [12,23,24,25,65,64,63,]
ciag_do_znalezienia = [25,65,64]

for i in KnuthMorrisPratt(lista_wejsciowa, ciag_do_znalezienia):
    print(i)

Jest to iterator, zatem zwraca nie tylko pierwszy, ale i kolejne wystąpienia podciągu. Policzenie ile razy wystąpił podciąg sprowadza się do policzenia ile wyników zwrócono:

print(len(list(KnuthMorrisPratt(lista_wejsciowa, ciag_do_znalezienia))))
0

Dział dokładnie tak jak chciałem , bardzo duże dziękuję dla ciebie , ogromne ułatwienie super

1 użytkowników online, w tym zalogowanych: 0, gości: 1