"TypeError: string indices must be integers" hatası

Ark_Us

Megapat
Katılım
7 Nisan 2017
Mesajlar
907
Makaleler
1
Çözümler
7
Herkese merhaba.

Kodu şöyle kısalttım. 2 tane saçma durum var bu kod da inputdan alınana değer girilmez alta paracek fonksiyona direkt yazılırsa çalışıyor ama imput'dan alınan değer yazılırsa hata veriyor hata şu şekilde.

Traceback (most recent call last):
File "c:\Users\ast_4\Desktop\python\+2 deneme bölümü.py", line 115, in <module>
paraCek(hesap1 , miktar1)
File "c:\Users\ast_4\Desktop\python\+2 deneme bölümü.py", line 113, in paraCek
print(f"merhaba {hesap['ad']} ")
TypeError: string indices must be integers

Python:
aHesap = {
    "ad": "mehmetB",
    "hesapNo" : "8946534",
    "bakiye" : 2000,
    "ekHesap": 1000
}

bHesap = {
    "ad": "aliA",
    "hesapNo" : "8946534",
    "bakiye" : 2000,
    "ekHesap": 1000
}
karar = int(input("para çekmek için 1 yatırmak içinse 2 yazınız: "))

if karar == 1:
    hesap1 = input("hesap ad: ")
    miktar1 = int(input("miktar: "))

    def paraCek(hesap, miktar):
        print(f"merhaba {hesap['ad']} ")
 
    paraCek(hesap1 , miktar1)

Gözünüze çarpan yanlış bir kullanım var mı ?
 
Son düzenleyen: Moderatör:
Hesap1 değişkenine string olarak bir ad alıyorsunuz fakat hangi dictionary'e ait olduğunu bilmiyorsunuz. Daha sonra da dictionary'den ismi çekmek için hesap["ad"] şeklinde bir yapı kullanıyorsunuz fakat hesap değişkeninde bir dictionary değil bir string var. Ayrıca hesapları da bir liste içinde saklamanız daha doğru olur çünkü bu şekilde hesaplarda döngü döndüremezsiniz. Yazmak istediğiniz yazılıma ve yazdığınız koda baktığımda bu yazılımı yazmak için yeterli temeliniz olmadığı anlaşılıyor. Python'daki veri yapılarını araştırın ve yazdığınız her satırdaki kodların ne işe yaradığını iyice düşünün, ondan sonra bu kodu tekrar sıfırdan yazın.

Ek olarak hesap[ad] yerine hesap.get(ad) olması gerek.
Konunun bununla bir alakası yok, iki kullanım da doğru. Tek farkları hesap["ad"] kullanıldığında dictionary'de "ad" diye bir key yoksa KeyError hatası bırakılır, hesap.get("ad") ise "ad" diye bir key yoksa boş olarak geri dönüş yapar.
 
Cevaplarınız için çok teşekkürler dıp dızlak kaldık valla. sizce sorun nereden kaynaklı inputdaki veri göndermezsem çalışıyor diğer türlü problem birde ben kodun kısaltılmış halini attım sanırırm uzun kodları okumaya üşeniyorlar :D

If içinde fonksiyon tanımı tuhaf olmuş. Ek olarak hesap[ad] yerine hesap.get(ad) olması gerek.

Evet biraz öyle oldu o an aklıma öyle geldi :D
If içinde fonksiyon tanımı tuhaf olmuş. Ek olarak hesap[ad] yerine hesap. Get(ad) olması gerek.

Evet biraz o an öyle aklıma geldi yaptım gitti.

Cevapalrınız için çok teeşekürle ne yapacagımı şaşırdım çözümüde bulamadım bir türlü.

Gözünüze çarpan yanlış bir kullanım var mı?
 
Son düzenleme:
Gözünüze çarpan yanlış bir kullanım var mı
Yazdım ya zaten?

Hesap1 değişkenine string olarak bir ad alıyorsunuz fakat hangi dictionary'e ait olduğunu bilmiyorsunuz. Daha sonra da dictionary'den ismi çekmek için hesap["ad"] şeklinde bir yapı kullanıyorsunuz fakat hesap değişkeninde bir dictionary değil bir string var.
 
Hesap1 değişkenine string olarak bir ad alıyorsunuz fakat hangi Dictionary'e ait olduğunu bilmiyorsunuz. Daha sonra da Dictionary'den ismi çekmek için hesap["ad"] şeklinde bir yapı kullanıyorsunuz fakat hesap değişkeninde bir dictionary değil bir string var. Ayrıca hesapları da bir liste içinde saklamanız daha doğru olur çünkü bu şekilde hesaplarda döngü döndüremezsiniz. Yazmak istediğiniz yazılıma ve yazdığınız koda baktığımda bu yazılımı yazmak için yeterli temeliniz olmadığı anlaşılıyor. Python'daki veri yapılarını araştırın ve yazdığınız her satırdaki kodların ne işe yaradığını iyice düşünün, ondan sonra bu kodu tekrar sıfırdan yazın.

Konunun bununla bir alakası yok, iki kullanım da doğru. Tek farkları hesap["ad"] kullanıldığında Dictionary'de "ad" diye bir key yoksa keyerror hatası bırakılır, hesap.get("ad") ise "ad" diye bir key yoksa boş olarak geri dönüş yapar.

Cevap için teşekkürler aslıdna kodu yazan ben değilim eğitim aldıgım hoca yazdı bende kendimi geliştirmek istedigim için kodu geliştirmeye karar verdim kodun hemen her satırını nasıl çalıştıgını 3 aşa 5 yukarı biliyorum hatta bunları tek tek nasıl çalıştığını zorsunmadan yazabilirim hiç sorun değil benim için hatamı gördüğünüz yerde bildirebilirsiniz.
Yazdım ya zaten?
kusura bakamayın mesaj gitmedi zannetdim tekrar yazdım :D
Merhaba bir şey sormak istiyorum size şöyle birkaç deneme yaptım ama sanırım dict liste bicimi ile olacak gibi görünmüyor ben normal liste çevirip kodu düzenlesem daha iyi olacağını düşünüyorum eğer ki bu şekilde inputdan almamın bir yolu yoksa.
 
Son düzenleme:
Merhaba bir şey sormak istiyorum size şöyle birkaç deneme yaptım ama sanırım dict liste bicimi ile olacak gibi görünmüyor ben normal liste çevirip kodu düzenlesem daha iyi olacağını düşünüyorum eğer ki bu şekilde inputdan almamın bir yolu yoksa.
Dictionary'leri olduğu gibi bir listeye ekleyin. Daha sonra yazılan isme sahip olan dictionary'i bulmak ve seçmek için aşağıdaki gibi bir yapı kullanabilirsiniz.

Python:
secilen_hesap = [i for i in hesap_listesi if i["ad"] == hesap_adi][0]
 
Son düzenleme:
Dictionary'leri olduğu gibi bir listeye ekleyin. Daha sonra yazılan isme sahip olan Dictionary'i bulmak ve seçmek için aşağıdaki gibi bir yapı kullanabilirsiniz.

Python:
secilen_hesap = [bulunan_hesap for i in hesap_listesi if i["ad"] == hesap_adi][0]

Bir tık zor anlayan biriyim(bir tık mı?) eğer ki yanlış anlamdıysam list compresion yapılmış köşeli parantezin içini açıklamaya çalışırsam bulunan_hesap değişken olması gerek(tam bilmiyorum öyle tahmin ediyorum) for döngüsü hesap listesini gez ardına if de i değişkeni ad Index'in hesap_adi'nın 0 indexsine eşit mi yanlış anlamaıysam böyle ama başındaki bulunan_hesap ne olduğunu tam bilmiyorum.
 
Bir tık zor anlayan biriyim(bir tık mı?) eğer ki yanlış anlamdıysam list compresion yapılmış köşeli parantezin içini açıklamaya çalışırsam bulunan_hesap değişken olması gerek(tam bilmiyorum öyle tahmin ediyorum) for döngüsü hesap listesini gez ardına if de i değişkeni ad Index'in hesap_adi'nın 0 indexsine eşit mi yanlış anlamaıysam böyle ama başındaki bulunan_hesap ne olduğunu tam bilmiyorum.
Kodu telefondan yazdığım için bulunan_hesap kısmını yanlışlıkla yazmışım, orası da i olacak.

Anlatayım kodu. Köşeli parantezler içindeki tek satır for döngüsü hesap listesi içinde dönerken her hesabı sırayla i'ye alıyor, "ad" kısmı girilen isme eşit olan i değişkenindeki dictionary'i de yeni bir listeye atıyor. Sonuç olarak elimizde bir liste oluyor. Yani "ad" kısmı girilen isme eşit olan birden fazla hesap varsa onlar da listede olacak ama bizim birini seçmemiz gerek amacımız için. Listeyi döndüren yerin sağına da [0] yazıp sonuç listesindeki 0. indexteki dictionary'i, yani ilk bulunan hesabı alıyoruz.
 
Kodu telefondan yazdığım için bulunan_hesap kısmını yanlışlıkla yazmışım, orası da i olacak.

Anlatayım kodu. Köşeli parantezler içindeki tek satır for döngüsü hesap listesi içinde dönerken her hesabı sırayla ı'ye alıyor, "ad" kısmı girilen isme eşit olan i değişkenindeki Dictionary'i de yeni bir listeye atıyor. Sonuç olarak elimizde bir liste oluyor. Yani "ad" kısmı girilen isme eşit olan birden fazla hesap varsa onlar da listede olacak ama bizim birini seçmemiz gerek amacımız için. Listeyi döndüren yerin sağına da [0] yazıp sonuç listesindeki 0. indexteki Dictionary'i, yani ilk bulunan hesabı alıyoruz.

Üşenmeyip yazdığınız için teşekkürler o zaman if i ["ad"] == hesap_adi eşitse en dış köşeli parantezde ki listenin içine atacak değil mi? hesap_adi inputdan alınana değer osla gerek

Bir deneme yaptım ama ne yazık ki aynı hatayı verdi.
en güzeli şöyle yapayım ben hesapları normal bir listeye saklayım ama dict gibi nasıl yapabilirm henüz bilmiyorum şeklini aynı yapabilirim ama yazılmasını aynı şekilde tabiki yapamayabilirim
 

Technopat Haberler

Geri
Yukarı