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]
- 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]
İ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
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ç
Iste oda benim aklıma gelmedi
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.
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]))