Listelerde Yerel Maksimum ve Tekrar Eden Elemanların Silinmesi

Soru1:Bir liste veriliyor eğer bir eleman sağındaki ve solundaki elemandan büyük ise yerel maksimumdur.Fakat dikkat edilmesi gereken bir nokta var  oda bir eleman kendini tekrar ediyorsa tekrar sayısı dikkate alınmayacak.Örnek herşeyi daha iyi anlatıyor.
[1,2,3,5,2,6,6,4] yerel maksimumlar bu örnek için 5 ve 6 dır.
[3,4,4,4,3] bu örnek için yerel maksimum 4 dür.
İstediğimiz şu fonksiyonumuz hem yerel maksimumları  döndürsün hemde ilk gözüktüğü indisleri
Birinci Örnek için çıktı=[[5,6],[3,5]]
İkinci Örnek için çıktı=[[4],[1]]

Soru 2:
Liste içinde tekrar eden eleman varsa ve bunlar yanyana ise bunları bir adete düşüren fonksiyonu yazmak.
Örnek
foo([1,-1,-1,3,4,4,4,7,7,4,6,1,1,1,2,-1])
çıktı
[1, -1, 3, 4, 7, 4, 6, 1, 2, -1]
  1. Soru için

def foo(liste):
	new = []
	for i,j in zip(liste, range(len(liste))):
		if liste[j-1]!= i:
			new.append(i)
	return new

print(foo([-2,-1,-1,0,4,4,4,4,5,6,7,8,8,4,6]))

#output  [-2, -1, 0, 4, 5, 6, 7, 8, 4, 6]


1 Beğeni

İlk soru için:

def yerel_maksimum(l):
    result = {
        i: l[i]
        for i in range(len(l))
        if l[i - 1] <= l[i] >= l[i + 1 if i != len(l) - 1 else 0] 
        and
        l[i - 1] != l[i]
    }
    return [[*result.values()], [*result.keys()]]


x = [1,2,3,5,2,6,6,4]
print(yerel_maksimum(x))
# [[5, 6], [3, 5]]

fonksiyonunuz başka örneklerde yanlış çıktı veriyor
Örnek:

print(yerel_maksimum([-2,-1,-1,0,4,4,4,4,5,6,7,8,8,4,6]))
[[-1, 4, 8, 6], [1, 4, 11, 14]] bu yanlış 
doğrusu [[8],[11]]

Bu yukarıda yaptığınızı enumarate ile de yapabilirmişsiniz.
Benim aklıma gelmedi aslında çok basit oluyormuş ben baya zorlamışım yok yere kendimi :slight_smile:

def foo(liste):
    yeni=''
    sonuç=[]
    for i in liste:
        yeni+=str(i)


    for i in yeni:
        for j in range(1,len(yeni)):
            if j*i in yeni :

                yeni=yeni.replace(j*i,i)
            if j*('-'+i) in yeni:

                yeni=yeni.replace(j*('-'+i),'-'+i)
    k=0
    while  k<len(yeni):
        if yeni[k]!='-':
            sonuç.append(int(yeni[k]))
        else:
            sonuç.append(-1*int(yeni[k+1]))
            k=k+1
        k=k+1

    return sonuç
1 Beğeni

Iste oda benim aklıma gelmedi :slight_smile:

Sizin doğrusu olarak yazdığınız sonuç, ilk mesajınızda belirttiğiniz koşula uymuyor.

Yukarıdaki örnekte 6'yı almışsınız. çünkü solundaki sayı olan 2'den büyük, sağındaki 6'ya da eşit.

Aynı durum [-2,-1,-1,0,4,4,4,4,5,6,7,8,8,4,6] listesi içindeki -1 için de geçerli. -1, solundaki -2'den büyük, sağındaki -1'e de eşit. Dolayısıyla bu sayıyı aldım çünkü sizin yukarıdaki örneğinize uyuyor.

Aynı durum 4 için de geçerli, 4, solundaki 0 sayısından büyük, sağındaki 4 sayısına eşit.

Bir tek belki son eleman olan 6 uymayabilir, ama onu da kodla değiştirebilirim. 6 da solundaki 4'ten büyük ve sağında bir sayı olmadığı için 0. indise bakıldı, 0. indiste -2 sayısı yer alıyor ve -2 de 6'dan küçük olduğu için 6 sayısı da yerel maksimum olarak bulundu. Ama eğer bu durum geçerli değilse, kodlarda bir değişiklik yaparım.

Fakat yukarıdaki diğer iki örnek zaten sizin ilk gönderideki örneğinizde belirttiğiniz koşula göre bulundu. Zaten 8 için geçerli olan durum, -1 ve 4 için de geçerli.

Düzeltilmiş kodlar:

def yerel_maksimum(l):
    result = {
        i: l[i]
        for i in range(len(l))
        if i != len(l) - 1
        and
        l[i - 1] <= l[i] >= l[i + 1] 
        and
        l[i - 1] != l[i]
    }
    return [[*result.values()], [*result.keys()]]
    
        
x = [-2,-1,-1,0,4,4,4,4,5,6,7,8,8,4,6]
print(yerel_maksimum(x))

Çıktı:

[[-1, 4, 8], [1, 4, 11]]

Anlatımda o örneği kullandım takdir edersinizki çok fazla örnek veremiyorum.Ama demekki tam düzgün anlatamamışım ki sorun oluştu şöyle daha net olur diye düşünüyorum diyelim ki

2333331 gibi bir durum var burada bir tane 3 var gibi düşünüp 3 yerel maksimumdur diyoruz yani tekrarı önemsemiyoruz
DOĞRU olarak söylediğim durum da bunu sağlıyor

Neden?

Ornekleri zaten vermissiniz:

Sadece soruda degil.

Bu arada ornekleri kod, hatta calistirilabilir kod olarak vermeniz lazim:

foo([1,-1,-1,3,4,4,4,7,7,4,6,1,1,1,2,-1])
çıktı
[1, -1, 3, 4, 7, 4, 6, 1, 2, -1]

yerine

assert(foo([1,-1,-1,3,4,4,4,7,7,4,6,1,1,1,2,-1]) == [1, -1, 3, 4, 7, 4, 6, 1, 2, -1])

gibi. Soruya cozum bulmaya calisan herkes bu kodu yaziyor zaten.

Onlarin da yazdiklari degisik ornekleri bu sekilde paylasmalari lazim.

1 Beğeni

yerel maksimum sorusuna ait çözümüm

def pickPeaks(liste):
    sonuç=[]

    for i in range(len(liste)):
        if i!=0 and i!=len(liste)-1:
            if liste[i]>liste[i+1] and liste[i]>liste[i-1]:
                sonuç.append([liste[i],i])
            if liste[i]==liste[i+1] and liste[i-1]<liste[i]:
                for j in range(i+2,len(liste)):
                    if liste[j]==liste[i]:
                        continue
                    if liste[j]>liste[i]:
                        break
                    if liste[j]<liste[i]:
                        sonuç.append([liste[i],i])
                        break
    return sonuç
print(pickPeaks([-2,-1,-1,0,4,4,4,4,5,6,7,8,8,4,6]))