Ders 07: Dosyalar, Metinler ve Sözlüklere İlişkin Alıştırmalar

  1. Anahtarı ($key$) kuvvetler, değerleri ($value$) katsayılar olan sözlük yapısındaki iki polinomu ($pol1$ ve $pol2$) argüman olarak alan ve bu iki polinomu topladıktan sonra çağrılıdğı yere yine aynı yapıda bir sözlük ($toplam_polinom$) olarak döndüren bir fonksiyon ($polinom_toplami$) yazınız. Fonksiyonunuzu $4x^5 + x^3 - 2$ polinomu ile $x^3 + x^2 - 2$ polinomlarını toplayarak test ediniz.
In [1]:
def polinom_toplami(pol1, pol2):
    toplam_polinom = {}
    for kuvvet in pol1:        
        if kuvvet in pol2:
            katsayitoplam = pol1[kuvvet] + pol2[kuvvet]
        else:
            katsayitoplam = pol1[kuvvet]
        toplam_polinom[kuvvet] = katsayitoplam
    for kuvvet in pol2:
        if not (kuvvet in pol1):
            toplam_polinom[kuvvet] = pol2[kuvvet]
    return toplam_polinom
            
p1 = {0:-1, 3:1, 5:4}
p2 = {0:-2, 2:1, 3:1}
top_p1_p2 = polinom_toplami(p1, p2)
for kuvvet in sorted(top_p1_p2):
    print(kuvvet, top_p1_p2[kuvvet])
0 -3
2 1
3 2
5 4
  1. WASP gezegen araştırmasında WASP-47 yıldızının etrafında keşfedilen 4 gezegenin kütle ($M$) ve yarıçapları ($R$) (wasp47.dat) dosyasında verilmiştir. Öncelikle $gezegenler$ adında boş bir sözlük oluşturunuz. Size verilen dosyayı okumak ("$r$") için açtıktan sonra, satır satır okuyunuz. Her bir satırı $split()$ komutuyla boşluklardan ayırdıktan sonra oluşan metinleri $parametreler$ adlı bir listede toplayınız. Bu listenin ilk elemanını ($parametreler[0]$) $gezegen$ değişkenine, diğer elemanlarını ($parametreler[1:]$) ise daha önce oluşturduğunuz $gezegenler$ adlı sözlüğe $gezegen$ değişkenini anahtar ($gezegenler[gezegen]$) kabul eden bir değer listesi olarak alınız. Bir for döngüsü içinde $gezegenler$ sözlüğünü anahtarlarından okuyacağınız gezegen adlarına karşılık, değerlerden alacağınız parametreler listesi şeklinde ekrana yazdırınız.
In [6]:
gezegenler = {}
dosya = open('wasp47.dat','r')
dosya.readline()
for satir in dosya:
    parametreler = satir.split()
    gezegen = parametreler[0]
    gezegenler[gezegen] = parametreler[1:]
for gezegen in gezegenler:
    print(gezegen, gezegenler[gezegen][:])
WASP-47e ['0.029', '0.167']
WASP-47d ['0.0428', '0.331']
WASP-47c ['1.31', '1.22']
WASP-47b ['1.13', '1.17']
  1. Bir önceki soruda yazdığınız kodu, $parametre\_adlari$ listesinin elemanları olarak tanımlayacağınız $kutle$ ve $yaricap$ parametre adlarını anahtar kabul eden değerlerini ise herbir gezegen için dosyadan okuyacağınız kayan noktalı sayı ($float$) değerleri olarak alan ($parametreler[1]$ ve ($parametreler[2]$) içiçe bir sözlük oluşturacak şekilde düzenleyiniz.
In [13]:
gezegenler = {}
dosya = open('wasp47.dat','r')
dosya.readline()
for satir in dosya:
    parametreler = satir.split()
    gezegen = parametreler[0]
    degerler = parametreler[1:]
    gezegenler[gezegen] = {}
    parametre_adlari = ['kutle', 'yaricap']
    for parametre, deger in zip(parametre_adlari, degerler):
        gezegenler[gezegen][parametre] = float(deger)
for gezegen in gezegenler:
    print(gezegen, gezegenler[gezegen])
WASP-47e {'yaricap': 0.167, 'kutle': 0.029}
WASP-47d {'yaricap': 0.331, 'kutle': 0.0428}
WASP-47c {'yaricap': 1.22, 'kutle': 1.31}
WASP-47b {'yaricap': 1.17, 'kutle': 1.13}
  1. Bir önceki soruda yazdığınız kodu, ilk satırı atlamak yerine ilk satırdaki ikinci ve üçüncü sütunlarda yer alan parametre adlarını (sırasıyla $kutle$ ve $yaricap$) her bir gezegenin parametrelerini alacağınız sözlüklerin anahtarı olacak şekilde düzenleyiniz.
In [1]:
gezegenler = {}
dosya = open('wasp47.dat','r')
ilk_satir = dosya.readline().split()
parametre_adlari = ilk_satir[1:]
for satir in dosya:
    parametreler = satir.split()
    gezegen = parametreler[0]
    degerler = parametreler[1:]
    gezegenler[gezegen] = {}
    for parametre, deger in zip(parametre_adlari, degerler):
        gezegenler[gezegen][parametre] = float(deger)
for gezegen in gezegenler:
    print(gezegen, gezegenler[gezegen])
WASP-47e {'kutle': 0.029, 'yaricap': 0.167}
WASP-47d {'kutle': 0.0428, 'yaricap': 0.331}
WASP-47b {'kutle': 1.13, 'yaricap': 1.17}
WASP-47c {'kutle': 1.31, 'yaricap': 1.22}
  1. $ogrenciler = ['pinar','buse','zeynep','javid']$ listesindeki elemanların her birini $ogrenciler.txt$ isimli bir dosyanın birer satırına bir döngü içerisinde yazdırınız. Dosyayı kapattıktan sonra bu kez sadece sonuna ekleme için açarak "$ozgur$" metnini yeni bir satıra ekleyiniz ve dosyayı tekrar kapatınız.
In [2]:
ogrenciler = ['pinar','buse','zeynep','javid']
dosya_ogrenciler = open('ogrenciler.txt','w')
for ogrenci in ogrenciler:
    metin = ogrenci+'\n'
    dosya_ogrenciler.write(metin)
dosya_ogrenciler.close()
dosya_ogrenciler = open('ogrenciler.txt','a')
dosya_ogrenciler.write('ozgur')
dosya_ogrenciler.close()
  1. $ogrenciler.txt$ dosyasını yazmak için yeniden oluşturunuz. Dosyanın ilk satırına $Ogr.No$ metni ile $Ad Soyad$ metinlerini aralarına "$<TAB>$" karakteri gelecek şekilde yazınız. Daha sonra
$$ogrenciler = \{"12050566":'Pinar Tunc', "15050021":'Buse Sayar', "14050019":'Zeynep Kucukdeveci', "14050335":'Javid Bashirzade'\}$$

sözlüğündeki her bir öğrencinin, öğrenci numarası (sözlüğün anahtarları) ile adı ile soyadını (sözlüğün değerleri) aralarına "$<TAB>$" karakteri geleecek şekilde bu dosyanın birer satırına yazdırınız.

In [4]:
ogrenciler = {"12050566":'Pinar Tunc', "15050021":'Buse Sayar',
              "14050019":'Zeynep Kucukdeveci',
              "14050335":'Javid Bashirzade'}
dosya_ogrenciler = open('ogrenciler.txt','w')
dosya_ogrenciler.write('#Ogr.No\tAd Soyad\n')
for ogrno in ogrenciler:
    metin = ogrno + '\t' + ogrenciler[ogrno] + '\n'
    dosya_ogrenciler.write(metin)
dosya_ogrenciler.close()
  1. xy.dat dosyasında iki sütun halinde verilen $x$ değerlerine karşılık $y$ değerlerini, sırasıyla $x$ ve $y$ listelerinde toplayınız. Bu listeleri $numpy$ dizilerine ($array$) dönüştürdükten sonra $x$'e karşılık $y$ değerlerini $matpotlib.pyplot$ fonksiyonlarını kullanarak kırmızı içi dolu yuvarlaklarla çizdiriniz. Grafiğinizin $x$ ve $y$ eksenlerini isimlendiriniz.
In [6]:
import numpy as np
from matplotlib import pyplot as plt
%matplotlib inline
dosya = open("xy.dat", "r")
x = []
y = []
for satir in dosya:
    koordinatlar = satir.split()
    x.append(float(koordinatlar[0]))
    y.append(float(koordinatlar[1]))
dosya.close()
x = np.array(x)
y = np.array(y)
plt.plot(x,y,'ro')
plt.xlabel('x')
plt.ylabel('y')
plt.show()
  1. Güneş Sistemi gezegenlerinin adları ($gezegenler$) ve gün cinsinden yörünge dönemleri ($donemler$) aşağıdai listelerde verilmiştir.
$$gezegenler = ['Merkur','Venus','Dunya','Mars','Jupiter','Saturn', 'Uranus','Neptun']$$$$donemler = [88.0, 224.7, 365.25, 687.0, 4331.0, 10747.0, 30589.0, 59800.0]$$

Her bir gezegenin adını anahtar, yorunge dönemini değer olarak alan $gunes\_sistemi$ adlı bir sözlük oluşturunuz. Oluşturduğunuz bu sözlüğün her bir elemanının adını ve yıl birimine dönüştüreceğiniz yörünge dönemini iki basamaklı olarak $gunes\_sistemi.txt$ dosyasına aralarına "$<TAB>$" karakteri gelecek şekilde satır satır yazdırınız.

In [9]:
gezegenler = ['Merkur','Venus','Dunya','Mars','Jupiter','Saturn', 'Uranus','Neptun']
donemler = [88.0, 224.7, 365.25, 687.0, 4331.0, 10747.0, 30589.0, 59800.0]
gunes_sistemi = {}
for i,gezegen in enumerate(gezegenler):
    gunes_sistemi[gezegen] = donemler[i]
dosya = open("gunes_sistemi.txt","w")
for gezegen in gunes_sistemi:
    yorunge_donemi = "{:.2f}".format(gunes_sistemi[gezegen]/gunes_sistemi['Dunya'])
    metin = gezegen + "\t" + yorunge_donemi + "\n"
    dosya.write(metin)
dosya.close()