Python - Listedeki Verileri Tekrarlayarak Hesaplayamıyorum!

Merhaba,

Aşağıdaki gibi bir listem var.

total_list = [100.0, 150.0, 100.0, 150.0, 260.0, 230.0]

Listemin içerisindeki değerlerin türü Float.

Bu listedeki değerlerden bir hesap yaparak yazdırmak istiyorum. Yapmak istediğim hesaplama şu şekilde;

total_list = [100.0, 150.0, 100.0, 150.0, 260.0, 230.0]

uzunluk = len(total_list)

toplananlar = list()
cikarilanlar = list()

x = 0
y = 1
for i in total_list:
    bakiye_1 = total_list[x] + total_list[y]
    toplananlar.append(bakiye_1)
    #burada her tutarın kendisinden sonra gelen tutarla olan toplamını bulmak istedim
    
    bakiye_2 = total_list[y] - total_list[x]
    cikarilanlar.append(bakiye_2)
    #burada her tutarın kendisinden bir önce gelen tutarla arasındaki farkı bulmak istedim

    x += 1
    y += 1
    #listedeki bir sonraki değerleri alabilmek için x değişkenini arttırmak istedim

    if y > uzunluk:
        break
    else:
        pass
    #listenin uzunluğu ile yapılacak işlemi kontrol eden ifadeyi kurmak istedim

Şimdi doğal olarak program diyor ki sen i değişkenini atamışsın. ilk işlemde i[0]. indekste iken sen diyorsun ki bana 0. ve 1. indeksteki değerlerin toplamını hesapla diyorsun. benim bilmediğim bir indeksteki değeri benden isteyemezsin diyor hata veriyor. Ya da ben bu şekilde anlıyorum.

Nasıl bir çözüm önerirsiniz?

Merhaba,

if y > uzunluk yerine if y == uzunluk veya if y >= uzunluk yazarsanız hata almazsınız.

Ayrıca bu kodları şöyle bir hale de getirebilirsiniz.

def topla(liste):
    return [
        liste[i] + liste[i + 1]
        for i in range(len(liste)) if i != len(liste) - 1
    ]
    
    
def cikar(liste):
    return [
        liste[i + 1] - liste[i]
        for i in range(len(liste)) if i != len(liste) - 1
    ]


print(topla(total_list))
print(cikar(total_list))

İsterseniz bu iki fonksiyonun işlevlerini alıp tek bir fonksiyona ekleyebilirsiniz.

def hesap(liste, islem):
    return [
        liste[i] + liste[i + 1] if islem == "+" 
        else liste[i + 1] - liste[i] if islem == "-" else 0
        for i in range(len(liste)) if i != len(liste) - 1
    ]


print(hesap(total_list, "+"))
print(hesap(total_list, "-"))
2 Beğeni

Kodu aşağıdaki gibi yazarsan sorun çözülüyor sanki

2 Beğeni
>>> l = [1, 2, 3, 4]
>>> for x, y in zip(l[:-1], l[1:]):
	print(x, y)

	
1 2
2 3
3 4
>>> 

Şöyle daha iyi sanki:

total_list = [1, 2, 3, 4]

def hesap(liste, islem):
    return [
        islem(liste[i], liste[i + 1])
        for i in range(len(liste)-1)
    ]


print(hesap(total_list, lambda i, j: i+j))
print(hesap(total_list, lambda i, j: i-j))
3 Beğeni
total_list = [100.0, 150.0, 100.0, 150.0, 260.0, 230.0]

uzunluk = len(total_list)

toplananlar = list()
cikarilanlar = list()


def toplananlar(liste):
    #print(liste)
    x = 1
    topList = []
    for i in liste:
        if (not x==uzunluk): 
            onceki = i
            sonraki = liste[x]
            toplam = onceki + sonraki
            topList.append(toplam)
        x += 1
    return topList
    
    
def cikarilanlar(liste):
    x = 1
    farkList = []
    for j in liste:
        if (not x==uzunluk):
            onceki = j
            sonraki = liste[x]
            fark = onceki - sonraki
            farkList.append(fark)
        x += 1
    return farkList

print("Tüm Liste:", *total_list)
print("Toplam Listesi:", *toplananlar(total_list))
print("Fark Listesi:", *cikarilanlar(total_list))
1 Beğeni

Hocam selam , çözümünüzün doğru sonucu verdiği aşikar,. Ancak algoritma analizi olarak bakıldığında, biraz karmaşık olup data büyüdüğünde çalışma süresinin uzayacağını düşünüyorum.

Örneğin 1 den 1000 e kadar sayıların toplamını hesapladığımızı varsayalım. sayaç yada döngü kullanıp çalıştırdığınızda döngü 1000 kez çalışacak ancak “gauss formülü” ile yaptığınızda aynı hesabı çalışma zamanı önemli ölçüde farkedecektir.

2 Beğeni

Bu da olur tabi, neden olmasın.

2 Beğeni

Söz konusu ardışık sayılar olduğunda, dediğiniz gibi gauss yöntemi’ni kullanmak daha avantajlı. Ama bu örnekte ardışık sayılar yerine rastgele sayılar var ve toplama işleminin gerçekleşmesi için bir döngü veya bir recursion şart.

2 Beğeni

Herkese verdikleri cevaplar için teşekkür ederim. Her birini deneyip en çok ihtiyacımı en anlaşılır şekilde göreni kullanacak diğerlerini not edeceğim. Anlayamadığım kısım muhakkak olur. Onu da birazdan sorarım. Tekrardan teşekkürler.

@dildeolupbiten @EkremDincel @Bahadir_Ustem @Muallim

1 Beğeni

Bu bahsettiğiniz tek bir fonksiyonu hem + işlemleri hemde - işlemleri için ayrı ayrı çağırmamız gerekiyor dimi?

x = 0
y = 1

yerine

x = 0; y = 1

yazmanın olayı nedir? Faydası ne oluyor da sorun çözülüyor?

Evet. Bir toplama, bir çıkarma işlemi yapacaksanız, iki kere çağırmanız gerekiyor.

1 Beğeni

ihtiyacımı en kısa şekilde çözen kod bu oldu ama zip fonksiyonuna dair bilgim yok. baştan sona giderken aldığı değer x sondan başa gelirken aldığı değer y mi oluyor? Doğru mu anladım?

zip fonksiyonu iki farklı listenin elemanlarını karşılıklı eşleştiriyor.

l[1:] # listesi 2, 3, 4 | ilk elemanı almaz
l[:-1] # listesi 1, 2, 3 | son elemanı almaz
1 Beğeni

Aslında farklı bir kullanımı yok. Tek satırda birden fazla komut yazabilmeyi sağlıyor sadece… çözümü oluşturan şey son satırda…

y > len(total_list)-1:
break

Size değişken tablosunu da gönderdim. y nin son değeri 6 olduğunda döngü durmak zorunda… Dikkat ederseniz cikarilan ve toplanan listeleri 5 elemanlı…

2 Beğeni

; karakteri birden fazla statement’i ayırmayı sağlıyor, farklı satırlara yazmaktan bir farkı yok.

Şöyle yazmamız anlamanız için yeterli olur sanırım:

def zip(x, y):
    x = iter(x)
    y = iter(y)
    try:
        while True:
            yield next(x), next(y)
    except StopIteration:
        pass

l = [1, 2, 3, 4]
for x, y in zip(l[:-1], l[1:]):
    print(x, y)
1 Beğeni

Bu konu sayesinde sizlerden öğrendiklerimle kendimce aşağıdaki gibi birşey yaptım, çıktı kısmında kafamı kurcalayan yeri yine size sorup öğrenmek istiyorum;

l = [100.0, 150.0, 100.0, 150.0, 260.0, 230.0]

tplSnc = [(l[i]+l[i+1]) for i in range(len(l)-1)]
frkSnc = [(l[i]-l[i+1]) for i in range(len(l)-1)]

fonk = lambda l, c=None: tplSnc if (c=="+") else (frkSnc if (c=="-") else print("\nToplamlar:", tplSnc, "\nFarklar:", frkSnc, sep="\n"))

print("Sadece Toplamlar", fonk(l, "+"))
print("Sadece Farklar", fonk(l, "-"))
print("TÜM SONUÇLAR", fonk(l))

Çıktı

Sadece Toplamlar [250.0, 250.0, 250.0, 410.0, 490.0]
Sadece Farklar [-50.0, 50.0, -50.0, -110.0, 30.0]

Toplamlar:
[250.0, 250.0, 250.0, 410.0, 490.0]

Farklar:
[-50.0, 50.0, -50.0, -110.0, 30.0]
TÜM SONUÇLAR None

print içerisinde TÜM SONUÇLAR olarak yazdığım başlık metni neden fonk(total_list) ten gelen sonuçlardan sonra gösteriliyor? Yani normalde aşağıdaki gibi olması gerekmiyor muydu?

Sadece Toplamlar [250.0, 250.0, 250.0, 410.0, 490.0]
Sadece Farklar [-50.0, 50.0, -50.0, -110.0, 30.0]

TÜM SONUÇLAR
Toplamlar:
[250.0, 250.0, 250.0, 410.0, 490.0]

Farklar:
[-50.0, 50.0, -50.0, -110.0, 30.0]
None
1 Beğeni

Bunun sebebi, fonk fonksiyonundaki, ... print("...") ... ifadesi, bu, fonksiyondan bir şey dödürmez ve None olarak görünür.

Şu kod istediğiniz çıktıyı verir:

l = [100.0, 150.0, 100.0, 150.0, 260.0, 230.0]

tplSnc = [(l[i]+l[i+1]) for i in range(len(l)-1)]
frkSnc = [(l[i]-l[i+1]) for i in range(len(l)-1)]

fonk = lambda l, c=None: tplSnc if (c=="+") else (frkSnc if (c=="-") else f"\nToplamlar: {tplSnc}\nFarklar: {frkSnc}")

print("Sadece Toplamlar", fonk(l, "+"))
print("Sadece Farklar", fonk(l, "-"))
print("TÜM SONUÇLAR", fonk(l), sep="\n")

Veya şu da işinizi görebilir:

l = [100.0, 150.0, 100.0, 150.0, 260.0, 230.0]

tplSnc = [(l[i]+l[i+1]) for i in range(len(l)-1)]
frkSnc = [(l[i]-l[i+1]) for i in range(len(l)-1)]

fonk = lambda l, c=None: tplSnc if (c=="+") else (frkSnc if (c=="-") else print("TÜM SONUÇLAR", "\nToplamlar:", tplSnc, "\nFarklar:", frkSnc, sep="\n"))

print("Sadece Toplamlar", fonk(l, "+"))
print("Sadece Farklar", fonk(l, "-"))
fonk(l)
2 Beğeni

Eyvallah, anladım çok teşekkürler.

1 Beğeni