Nerede yanlış yapıyorum?

Merhabalar. Basit bir program yazmak istedim, yazımı her ne kadar karmaşık gözükse de. Problemim şu; fonksiyonu belli parametrelerle ilk çağırdığımda sorun yaşamıyorum fakat aynı parametreleri ilk değerlerine döndürüp tekrar çağırmak istediğimde yanlış sonuçlar veriyor. Halbuki aynı parametreleri ilk öncekinde nasıl gönderdiysem aynı şekilde gönderdiğimi düşünüyorum. Yardımlarınız için şimdiden teşekkürler.


ögrt2 = {
	"Mustafa": [[1, 1, 1, 1, 1],[0,0,0]],
	"Tuğrul":  [[1, 1, 1, 1, 1],[0,0,0]],
	"Sadık":   [[0, 0, 0, 0, 1],[0,0,0]],
	"Hakan":   [[1, 1, 1, 1, 1],[0,0,0]],
	"Ahmet":   [[0, 0, 0, 0, 1],[0,0,0]],
	"Rıza":    [[0, 0, 0, 0, 1],[0,0,0]],
	"Yılmaz":  [[1, 1, 1, 1, 1],[0,0,0]],
	"Deniz":   [[0, 0, 0, 1, 1],[0,0,0]]
}

yerler2 = {
	"Ön bahçe": [],
	"Arka Bahçe": [],
	"1. Kat": []
}

nöbet2 = {
	"paz": list(),
	"sal": list(),
	"çar": list(),
	"per": list(),
	"cum": list()
}

nöbet = nöbet2.copy()
ögrt = ögrt2.copy()
yerler = yerler2.copy()

def foo(ögrt, yerler):
	gun = ""
	v = ""
	for ö in ögrt:
		ögrt[ö][1][0] = sum(ögrt[ö][0][0:5])

	f= list()
	def torba(ögrt, v, nöbet, gun):
		global f
		temp = dict()

		m = list(filter(lambda x: ögrt[x][0][v]==1, ögrt))

		for ö in ögrt:
			if ö in m:
				temp[ö] = ögrt[ö].copy()

		f = sorted(temp.items(), key=lambda x:(x[1][1][2] ,x[1][1][0], x[1][1][1]))

		for i in f:
			if i[0][0] not in nöbet[gun]:
				return f[0][0]

	for gun in nöbet:
		v = 0

		for i in range(len(yerler)):

			if gun=="paz": v=0
			elif gun=="sal": v=1
			elif gun=="çar": v=2
			elif gun=="per": v=3
			elif gun=="cum": v=4

			ö = torba(ögrt, v, nöbet, gun)
			if ö!=None:

				nöbet[gun].append(ö)
				ögrt[ö][1][1] += 1
				ögrt[ö][1][2] += 1
				ögrt[ö][0][v] = 0
			
	print("-"*50)
	print(nöbet)
	return list(nöbet.values())

foo(ögrt, yerler)

nöbet = nöbet2.copy()
ögrt = ögrt2.copy()
yerler = yerler2.copy()

foo(ögrt, yerler)

Sorununuzu anlayamadım. Çalıştırdığımda aşağıdaki sonuç dönüyor ve kodlarınızda çalışmaya engel bir sorun yok. Ne olması gerekiyordu aşağıdaki yerine ?


{‘paz’: [‘Mustafa’, ‘Tuğrul’, ‘Hakan’], ‘sal’: [‘Yılmaz’, ‘Mustafa’, ‘Tuğrul’], ‘çar’: [‘Hakan’, ‘Yılmaz’, ‘Mustafa’], ‘per’: [‘Deniz’, ‘Tuğrul’, ‘Hakan’], ‘cum’: [‘Sadık’, ‘Ahmet’, ‘Rıza’]}

{‘paz’: [‘Mustafa’, ‘Tuğrul’, ‘Hakan’, ‘Yılmaz’], ‘sal’: [‘Yılmaz’, ‘Mustafa’, ‘Tuğrul’, ‘Hakan’], ‘çar’: [‘Hakan’, ‘Yılmaz’, ‘Mustafa’, ‘Tuğrul’], ‘per’: [‘Deniz’, ‘Tuğrul’, ‘Hakan’, ‘Mustafa’, ‘Yılmaz’], ‘cum’: [‘Sadık’, ‘Ahmet’, ‘Rıza’, ‘Deniz’, ‘Mustafa’, ‘Tuğrul’]}

şöyle ki fonksiyonu ilk çağırdığımda günlerde 3 öğe bulunuyorken ikinciye çağırdığımda 4 öğe bulunuyor. halbuki gönderdiğim parametreleri sıfırlayıp gönderiyorum. Aynı sonucu vermesini bekiyorum.

Merhaba, şu kodu çalıştırabilir misiniz ?

ögrt2 = {
   "Mustafa": [[1, 1, 1, 1, 1],[0,0,0]],
   "Tuğrul":  [[1, 1, 1, 1, 1],[0,0,0]],
   "Sadık":   [[0, 0, 0, 0, 1],[0,0,0]],
   "Hakan":   [[1, 1, 1, 1, 1],[0,0,0]],
   "Ahmet":   [[0, 0, 0, 0, 1],[0,0,0]],
   "Rıza":    [[0, 0, 0, 0, 1],[0,0,0]],
   "Yılmaz":  [[1, 1, 1, 1, 1],[0,0,0]],
   "Deniz":   [[0, 0, 0, 1, 1],[0,0,0]]
}

yerler2 = {
   "Ön bahçe": [],
   "Arka Bahçe": [],
   "1. Kat": []
}

nöbet2 = {
   "paz": list(),
   "sal": list(),
   "çar": list(),
   "per": list(),
   "cum": list()
}

nöbet = nöbet2.copy()
ögrt = ögrt2.copy()
yerler = yerler2.copy()

def foo(ögrt, yerler):
   gun = ""
   v = ""
   for ö in ögrt:
   	ögrt[ö][1][0] = sum(ögrt[ö][0][0:5])

   f= list()
   def torba(ögrt, v, nöbet, gun):
   	global f
   	temp = dict()

   	m = list(filter(lambda x: ögrt[x][0][v]==1, ögrt))

   	for ö in ögrt:
   		if ö in m:
   			temp[ö] = ögrt[ö].copy()

   	f = sorted(temp.items(), key=lambda x:(x[1][1][2] ,x[1][1][0], x[1][1][1]))

   	for i in f:
   		if i[0][0] not in nöbet[gun]:
   			return f[0][0]

   for gun in nöbet:
   	v = 0

   	for i in range(len(yerler)):

   		if gun=="paz": v=0
   		elif gun=="sal": v=1
   		elif gun=="çar": v=2
   		elif gun=="per": v=3
   		elif gun=="cum": v=4

   		ö = torba(ögrt, v, nöbet, gun)
   		if ö!=None:

   			nöbet[gun].append(ö)
   			ögrt[ö][1][1] += 1
   			ögrt[ö][1][2] += 1
   			ögrt[ö][0][v] = 0
   		
   print("-"*50)
   print(nöbet)
   return list(nöbet.values())

print("nöbet  ",nöbet2)
foo(ögrt, yerler)
print("nöbet2 degişti  ",nöbet2)

Sorun şu siz bir liste veri yapısı oluşturup bunu bir değişkene atadığınız zaman, bu değişken atamış olduğunuz listeyi işaret ediyor. Örneğin a=list((1,2,3)) şeklinde yazdığınız ifade şu anlama geliyor a değişkeni hafızada list((1,2,3)) veri yapısına işaret etmekte. Sonra b=a dediğiniz zaman hem a hem de b hafızada aynı yere yani aynı list((1,2,3))'e işaret etmekte bundan dolayı siz a değişkeninde değişiklik yaparsanız mesela listeye yeni eleman örneğin 4 eklerseniz list((1,2,3)) son haliyle list((1,2,3,4)) olacaktır. b değişkenimizde list((1,2,3))'ü işaret ettiğinden dolayı b’nin son hali ise list((1,2,3,4)) olacaktır Sizin kodunuzda da bu tür bir durum var. Programınıza copy modülünü import ettikten sonra

nöbet = copy.deepcopy(nöbet2)
ögrt = copy.deepcopy(ögrt2)
yerler = copy.deepcopy(yerler2)

şeklinde deneyin sorun o zaman çözülecektir.

sorunum çözüldü. teşekkürler. Yalnız bir şeye takıldım. siz pointer lardan bahsediyorsunuz. Aslında ben bunu göz önüne alarak listeyi direkt eşitlemek yerine kopyalamayı tercih etmiştim. Hatta bunun mini bir testini yaptığımda istediğim sonucu almştım. mesela copy ile aldığım liste değişse bile bendeki liste değişmiyordu. Aşağıda bir örnek bırakıyorum.

n = [1,2,3]

m = n.copy()

n.append(5)

print(m)

burda çıktı olarak 1 2 3 veriyor. halbuki 5 eklendikten sonra işaret mantığına göre 1 2 3 5 vermesi gerekmiyor muydu?

list.copy metodu yeni bir liste döndürüyor. Liste sadece tam sayılar içerecekse copy.deepcopy gereksiz, list.copy kullanmak yeterli olur.

Sizler ve bu site olmasaydı bu kadar detayı öğrenmem çok zor olurdu. Teşekkürler.

Merhaba, problemin çözülmesi güzel. Siz zaten hata olabileceğini düşünerek kopyalama işlemi yapmışsınız fakat ben sizin bu durumu farketmediğinizi düşündüğüm için açıklama yapmıştım fakat yanılmışım özür dilerim bunun için. Ekrem Bey’in açıklamasından sonra biraz daha detaylıca kopyalama işlemini araştırdım, biraz da kendim denemeler yaptım. Örneğin ;

n = [1,2,3,[4,5]]
m = n.copy()
m[3].append(6)

print(m)
print(n)

Output:
[1, 2, 3, [4, 5, 6]]
[1, 2, 3, [4, 5, 6]]

Estagfurullah, teşekkürler.