İç içe sözlükler oluşturmak

Herkese merhaba,

Python öğrenmek için çalışırken bir problemle karşılaşmış ve tıkanmış durumdayım. Problemin isteği şu şekilde:

Elimde .txt uzantılı bir dosya var ve dosyanın içeriği şöyle:
[386Enh]
woafont=dosapp.fon
EGA8OWOA.FON=EGA8OWOA.FON
EGA4OWOA.FON=EGA4OWOA.FON
CGA8OWOA.FON=CGA8OWOA.FON
CGA4OWOA.FON=CGA4OWOA.FON
[drivers]
wave=mmdrv.dll
timer=timer.drv
[mci]

Öncelikle bu dosyanın okunması isteniyor(bunu yapabiliyorum tabii ki). Asıl sıkıntı şu, bu metinde köşeli parantez içerisinde kalan tüm ifadelerin sözlük anahtarı olması, bu anahtarlara karşılık gelen değerlerin de yine birer sözlük olması gerekiyor. İçerideki sözlüklerin anahtarları, değeri oldukları köşeli parantezli ifade ile bir sonraki köşeli parantezli ifadenin arasındaki eşitliklerin sol tarafı olacak. İçerideki sözlüklerin değerleri de yine aynı kısımdaki eşitliklerin sağ tarafı olacak.

Yani şöyle ilerleyecek:

sözlük={“386Enh”:{“woafont”:“dosapp.fon”,“EGA8OWOA.FON”:“EGA8OWOA.FON”,…

Hangi enstrümanlardan nasıl yararlanabilirim bu sözlüğe ulaşabilmek için? Lütfen çözümü doğrudan yazmaktan ziyade çözüme ulaşabilmem için ipuçları veriniz :slight_smile:

sadece replace yeterli olur.

Anlayamadım, biraz açabilir misiniz?

Merhaba, istediğiniz sözlüğün anahtarlarını köşeli parantezlerin içerisinde olan elemanlar belirlediğine göre evvela köşeli parantezle başlayan bir satıra denk geldiğinizi saptayarak başlayabilirsiniz, ne dersiniz?

Senin ilacın burada

1 Beğeni

Yorumunuz için çok teşekkür ederim. Benzer bir yöntemi [] ile başlayan ifadeleri listeye alarak da denedim ama bir sonraki adıma geçememiştim. Sanırım siz readlines() komutuyla saptamam gerektiğini söylüyorsunuz

Eğer bir satırın köşeli parantezle başladığını saptayabiliyorsanız, o aşamada sözlüğe bir anahtar eklemek gerekir, değil mi? Peki ya satır köşeli parantezle başlamıyorsa…

Yanıtınız için teşekkür ederim (:

İlerlediğim kitapta bu soru modüller/kütüphaneler konusundan önce sorulmuş. Yani listeleri-dosyaları-sözlükler vs pratik yapmak için, o yüzden attığınız linki şimdilik kullanamayacağım.

veri = """
[386Enh]
woafont=dosapp.fon
EGA8OWOA.FON=EGA8OWOA.FON
EGA4OWOA.FON=EGA4OWOA.FON
CGA8OWOA.FON=CGA8OWOA.FON
CGA4OWOA.FON=CGA4OWOA.FON
[drivers]
wave=mmdrv.dll
timer=timer.drv
[mci]
"""

def indeks_bul(yazi, harfler):
    indeksler = []
    for indeks in range(len(yazi)):
        harf = yazi[indeks]
        if harf in harfler:
            indeksler.append(indeks)
    return indeksler

parantezler = indeks_bul(veri, ("[", "]"))
satir_sonlari = indeks_bul(veri , "\n")
sozluk = {}

# İki koşeli parantez arasındaki kelimeleri çekerek,
# 386Enh, drivers ve mci'yi elde edelim.
for i1 in range(0, len(parantezler), 2):
    anahtar = veri[parantezler[i1] + 1: parantezler[i1 + 1]]
    sozluk.update({anahtar: {}})
    itemler = {}
    # Benzer bir yöntemle item'leri bulalım.
    for i2 in range(1, len(satir_sonlari)):
        try:
            if parantezler[i1 + 1] < satir_sonlari[i2] < parantezler[i1 + 2]:
                satir = veri[satir_sonlari[i2 - 1] + 1: satir_sonlari[i2]]
                sol, sag = satir.split("=")
                itemler.update({sol: sag})
        except (IndexError, ValueError) as exception:
            pass
        finally:
            sozluk[anahtar] = itemler

print(sozluk)

Çıktı:

{'386Enh': {'woafont': 'dosapp.fon', 'EGA8OWOA.FON': 'EGA8OWOA.FON', 'EGA4OWOA.FON': 'EGA4OWOA.FON', 'CGA8OWOA.FON': 'CGA8OWOA.FON', 'CGA4OWOA.FON': 'CGA4OWOA.FON'}, 'drivers': {'wave': 'mmdrv.dll', 'timer': 'timer.drv'}, 'mci': {}}
1 Beğeni
import json

veri = """
[386Enh]
woafont=dosapp.fon
EGA8OWOA.FON=EGA8OWOA.FON
EGA4OWOA.FON=EGA4OWOA.FON
CGA8OWOA.FON=CGA8OWOA.FON
CGA4OWOA.FON=CGA4OWOA.FON
[drivers]
wave=mmdrv.dll
timer=timer.drv
[mci]
"""

def converToDict(veri):
    lines = veri.split("\n")
    lines.pop(0)
    lines.pop()
    
    afterMainKey = False
    str = "{"
    for l in lines:
        if(l[0] == "["):
            if(len(str) > 1):
                str = str[:-1] +"}," 
            l =l.replace("[", "\"")
            l =l.replace("]", "\"")
            str = str + l + ": {}"
            afterMainKey = True
        else:
            if(afterMainKey):
                str = str[:-1]
                afterMainKey= False
            key_value = l.split("=")
            str  = str + "\"" + key_value[0] +"\" : \"" + key_value[1] +"\","
    str = str +"}"
    my_dict=json.loads(str)
    return my_dict

print(converToDict(veri))

:\

4 Beğeni

Her çözüm bir ipucudur.
Sonuçta bir problemin üstesinden gelinebilecek bin bir çeşit algoritma oluşturulabilir.

1 Beğeni

Öyledir belki ama olası çözümleri görmek problemi sıfırdan çözmeye çalışan kişinin hevesini kırabilir ve/veya kişi sunulan çözümlerin karmaşıklığı karşısında “tüh, ben bunu yazamazdım zaten” deyip tamamen pes edebilir…

4 Beğeni

Sorun ipucu verilip verilmemesi degil, OP’nin cozum yazilmamasi ricasina dogrudan karsi gelmis olman. Olmaniz.

1 Beğeni

Yardım ettiğimiz için özür dileriz.