Muszę napisać funkcję, która będzie liczyć, ile liczb jest uporządkowanych rosnąco w rzędzie. na przykład: mamy tę listę:

L = [2, 4, 5, 6, 7, 2, 3, 2, 2, 2, 8, 7, 5, 6]

A największa rosnąca seria liczb to 5.

Próbowałem:

count=0
def ascord(L,count):
    for i in range(0,len(L)-1):
        if L[i]<L[i+1]:
            count+=1
    return count

Ale na wyjściu jest 7. Nie wiem jak "zresetować" licznik więc nie wziąłby pod uwagę [2,8] i [5,6]

Edycja: miałem na myśli, że jeśli na przykład. dodaj na końcu listy dwadzieścia numerów rosnąco. aby były największą serią liczb, więc pierwsza liczba powinna być ustawiona na 0 i zacząć liczyć od początku

PS. Przepraszam za mój angielski.

0
kreativv 1 kwiecień 2020, 20:06

5 odpowiedzi

Najlepsza odpowiedź

Oczyszczone:

def ascord(L):
    answer = 0
    count = 1
    for i in range(len(L) - 1):
        if L[i] < L[i + 1]:
            count += 1
        else:
            if count > answer:
                answer = count
            count = 1
    return max(count, answer)

L = [2, 4, 5, 6, 7, 2, 3, 2, 2, 2, 8, 7, 5, 6]
print (ascord(L)) # 5

Twoje zdrowie :)

2
Gareth Ma 1 kwiecień 2020, 17:23

Edytowano:

Zainspirowany tutaj.

sub_lst = [0]+[i for i in range(1,len(L))  if L[i] < L[i-1] ]+[None]
print(max(len(x) for x in (L[b:e] for (b, e) in ((0,1) if sub_lst[1] == None else (sub_lst[i-1],sub_lst[i]) for i in range(1,len(sub_lst))))))

Nieczytelne, wiem. Potraktowałem to jako wyzwanie :)

-2
andreis11 1 kwiecień 2020, 20:45

Zamiast tego Twój kod liczy pary na liście L takie, że L[i] < L[i + 1]. Błąd polega na tym, że nie śledzisz ciągłości rosnącej sekwencji podrzędnej na liście. Na przykład, podczas iteracji nad L, jeśli w pewnym momencie wystąpi warunek L[i] >= L[i + 1], należy zresetować count. @Gareth Ma poprawił twój kod. Chociaż poniżej udostępniłem mój kod, który zwróci maksymalną długość rosnącego podciągu na liście L.

Zauważ, że podczas iteracji po L, cstart i cend są punktami indeksu dla bieżącego podciągu. Bieżący podciąg rośnie, aż bieżąca wartość cval smarownica niż poprzednia val - śledzi wzrost wartości. Na końcu każdego podciągu (z powodu wyczerpania iteracji lub obecnego cval jest mniejszy niż poprzedni val) porównuję długości podciągów i pauz start i end indeksy najdłuższych podciągów w L.

def find_longest_ascending(L):
    if len(L) < 2:
        return L
    I = enumerate(L)
    cstart, val = next(I)
    start = end = cstart
    for cend, cval in I:
        if cval <= val:
            if end - start < cend - cstart:
               start, end = cstart, cend
            cstart = cend
        val = cval
    if end - start < cend - cstart + 1:
       start, end = cstart, cend + 1
    return L[start: end]

Kiedy najdłuższy rosnący podciąg jest sufiksem L (w warunku-if poza pętlą for), cend nie wskazuje poza podciągiem dodanym 1.

0
Grijesh Chauhan 6 kwiecień 2020, 14:59

Dzięki groupby możesz znaleźć najdłuższą sekwencję elementów, które są sortowane rosnąco:

L = [2, 4, 5, 6, 7, 2, 3, 2, 2, 2, 8, 7, 5, 6]

from itertools import groupby 

sorted_seq=[]
for k,v in groupby(zip(L, L[1:]), key=lambda t:t[0]<t[1]):
    if k==True: 
        temp=list(v)
        sorted_seq.append([t[0] for t in temp]+[temp[-1][1]])

>>> sorted_seq
[[2, 4, 5, 6, 7], [2, 3], [2, 8], [5, 6]]

Następnie weź max tego z len jako kluczem:

>>> max(sorted_seq, key=len)
[2, 4, 5, 6, 7] 

Następnie:

>>> len(max(sorted_seq, key=len))
5

Co (jeśli nie zależy ci na porzuceniu ostatniego elementu posortowanej sekwencji i dodaniu 1 w celu skompensowania) może być pojedynczym zrozumieniem:

>>> len(max(([t[0] for t in v] for k,v in groupby(zip(L, L[1:]), key=lambda t:t[0]<t[1]) if k), key=len))+1
5
1
dawg 1 kwiecień 2020, 18:35

Zgodnie z Twoją logiką zacznij od

count = 1

Zamiast

count = 0

Użyj również dodatkowej zmiennej, aby śledzić maksymalną liczbę napotkaną do tej pory podczas przeglądania listy. Zresetuj licznik do 1, gdy wynurzanie się kończy.

def ascord(L):
    count, ans = 1, 1     
    for i in range(len(L) - 1):
        if L[i]<L[i+1]:
            count+=1
        else:
            count=1
        ans = max(count, ans)
    return ans
1
tandontburn 1 kwiecień 2020, 17:39