Döngü elemanlarına sınır koymak

Merhaba

Aşağıdaki kod bloğuyla resimdeki çıktıyı alabiliyorum. Her takımın 2 içeride 2 de dışarıda maç yapmasını sağlamak için kodu nasıl revize etmem gerekir. Yani her takım maçların [0] indeksinde 2 defa [1] indeksinde 2 defa yer alması gerekiyor.Teşekkürler.@Abdullah_V

Screenshot_9

print()
teams = [
    "Liverpool", "Manchester United",
    "Arsenal", "Barcelona",
    "Real Madrid"
]
random.shuffle(teams)
result = [(teams[i], teams[j]) for i in range(len(teams)) for j in range(i, len(teams)) if j != i]

#weekly_matches = []
# sayac = 1

# while True:
#     if len(teams) / 2 <= sayac:
#         for i in result:
#             # weekly_Matches = [i for i in enumerate(result, 1) if i ]
#             # weekly_matches.append()
#             print(i)
matches = [i for i in enumerate(result, 1)]
#print([result[i] for i in enumerate(result, 1) if i])
print(f"{'Champions League Matches':-^50}")
print()
for i in matches:

    print(i)
print("-" * 50)

Merhaba @Oguz_Turkyilmaz. Bu şekilde yaptım.

import random
teams = [
    "Liverpool", "Manchester United",
    "Arsenal", "Barcelona",
    "Real Madrid"
]
random.shuffle(teams)
tokens = [[0,0],[0,0],[0,0],[0,0],[0,0]]
#result = [[teams[i], teams[j]] for i in range(len(teams)) for j in range(i, len(teams)) if j != i]
result = []
for i in range(10):
    a = random.randint(0,4)
    while(tokens[a][0]==2):
        a = random.randint(0,4)
    b = random.randint(0,4)
    while(tokens[b][1]==2 or a == b):
        b = random.randint(0,4)
    result.append([teams[a],teams[b]])
    tokens[a][0] += 1
    tokens[b][1] += 1

#weekly_matches = []
# sayac = 1
print(result    )
# while True:
#     if len(teams) / 2 <= sayac:
#         for i in result:
#             # weekly_Matches = [i for i in enumerate(result, 1) if i ]
#             # weekly_matches.append()
#             print(i)
matches = [i for i in enumerate(result, 1)]
#print([result[i] for i in enumerate(result, 1) if i])
print(f"{'Champions League Matches':-^50}")
print()
for i in matches:

    print(i)
print("-" * 50)
1 Beğeni

@intelava Merhaba ilginiz için teşekkür ederim. Kodunuzu yazmadan evvel Satır başına 3 kesme işareti ve python kelimesini
" ```python "
şeklinde ifade eklerseniz kodu okumam mümkün olacak gönderdiğiniz şekilde çıktı alamıyorum.

Tekrar selam @Oguz_Turkyilmaz Tabii ki çıktı alamazsın çünkü program doğru çalışmıyor. Tekrar yazdım düzgün çalışıyor gibi. Kolay gelsin.

import random

teams = [

    "Liverpool", "Manchester United",

    "Arsenal", "Barcelona",

    "Real Madrid"

]

#random.shuffle(teams)

tokens = [[0,0],[0,0],[0,0],[0,0],[0,0]]

#result = [[teams[i], teams[j]] for i in range(len(teams)) for j in range(i, len(teams)) if j != i]

result = []

for first in range(len(teams)):

    for b in range(2):

        second = random.randint(0,4)

        while(tokens[second][1]==2 or first==second):

            second = random.randint(0,4)

        result.append([teams[first],teams[second]])

        tokens[first][0] += 1

        tokens[second][1] += 1

random.shuffle(result)

#weekly_matches = []

# sayac = 1

# while True:

#     if len(teams) / 2 <= sayac:

#         for i in result:

#             # weekly_Matches = [i for i in enumerate(result, 1) if i ]

#             # weekly_matches.append()

#             print(i)

matches = [i for i in enumerate(result, 1)]

#print([result[i] for i in enumerate(result, 1) if i])

print(f"{'Champions League Matches':-^50}")

for i in matches:

    print(i)

print("-" * 50)

Merhaba @intelava elinize sağlık evet bu sefer doğru sonuç veriyor fakat şöyle bir sıkıntı var takım sayısı azken
tokens = [[0,0],[0,0],[0,0],[0,0],[0,0]]
listesi makul yazılabilir ama takım sayısı normal ligler gibi 18-20 gibi sayılara çıktığında epey uzun bir sıfırlar listesi oluşuyor. Ben indekslerin üzerinden çözülebilir diye düşündüğüm için soruyu o şekilde sordum ama İndeksler üzerinden ulaşma dışında farklı bir yöntem bulunabilir mi ? Vakit ayırıp cevap verdiğiniz için tekrar teşekkür ederim.

tokens listesini bir for döngüsüyle oluşturursan ve range’i len(teams) yaparsan tek tek uğraşmana gerek kalmaz diye düşünüyorum. Eğer sorun 0 yazmanın zor gelmesiyse. Yoksa daha farklı bir yöntem mi istiyorsun? Rica ederim

Tek tek 18-20 tane [0,0] yazmanın zorluğundan ziyade daha kısa bir yöntem uygulanabilir mi diye düşünüyorum. Farklı bir yöntem tabi ki daha da bilgilendirici olur ve yöntemlerin karşılaştırılması şansı verirdi. Teşekkürler.

import random

teams = ["Liverpool", "Manchester United", "Arsenal", "Barcelona", "Real Madrid"]
random.shuffle(teams)

def solution(teams):
    assert len(teams)%2
    assert len(teams) > 1
    
    result = []
    repeat = len(teams) -1
    repeat_on_left = repeat // 2

    for i in range(len(teams)):
        try:
            for j in range(i+1, len(teams) -repeat_on_left): # eliminated the if by using '+1'
                result.append((teams[i], teams[j]))
        except IndexError: # when `repeat_on_left` becomes negative at the last 2 element, we should catch the error
            pass
        
        for j in range(j+1, len(teams)):
            result.append((teams[j], teams[i])) # reverse items
            
        repeat_on_left -= 1
        
    return result

def main():
    for i in solution(teams):
        print(i)
    test()

def test():
    s = {}
    for i, j in solution(teams):
        s.setdefault(i, 0)
        s[i] += 1

    assert all(map(lambda i: i== (len(teams) -1)//2 , s.values()))

if __name__ == "__main__":
    main()

Son iki elemanı ayrı bir döngüye alıp try-except’den kurtulabiliriz ama gerek duymadım.

Tekrar merhaba dediğiniz gibi 1-2 ilave yaptım daha kullanışlı oldu kanımca.

teams = ["Liverpool", "Manchester United", "Arsenal", "Barcelona", "Real Madrid"]
random.shuffle(teams)
token = [[0,0]]
tokens = [[0,0] for token in range(len(teams))]

result = []
for i in range(len(teams)*2):
    a = random.randint(0,len(teams)-1)
    while(tokens[a][0]==2):
        a = random.randint(0,len(teams)-1)
    b = random.randint(0,len(teams)-1)
    while(tokens[b][1]==2 or a == b):
        b = random.randint(0,len(teams)-1)
    result.append([teams[a],teams[b]])
    tokens[a][0] += 1
    tokens[b][1] += 1
matches = [i for i in enumerate(result, 1)]
print(f"{'Champions League Matches':-^50}")
print()
for i in matches:

    print(i)
print("-" * 50)

İlginiz için çok teşekkür ederim kodunuzda henüz öğrenmediğim çok şey var o yüzden tam okuyamıyorum kullandığınız bilmediğim terimlerin açıklamalarını önce bir hatim etmem gerekecek :slight_smile: Ancak ondan sonra hımmm evet bu buymuş bu nedenle öyle olmuş diye kendime ders çıkarabilecek seviyeye gelirim inşallah. Sağolun

1 Beğeni
def balcomb2i(n):
	for i in range(n):
		for j in range(i+1, n):
			if j - i <= n // 2:
				yield i, j
			else:
				yield j, i

def balcomb2(xs):
	return list(map(lambda c: (xs[c[0]], xs[c[1]]), balcomb2i(len(xs))))


teams = [
	"Liverpool", "Manchester United", "Arsenal", "Barcelona", "Real Madrid"
]

print("\n".join(map(str, sorted(balcomb2(teams)))))
3 Beğeni

Sn @aib yanıtınız için çok teşekkür ederim. Kod oldukça kısa benim bunu çözmem ve anlamam ise uzun zaman alacak bu öğrenme hızımla. Tekrar teşekkürler.

@aib sormayı unuttum kod sonucu oluşan 10 maçın her birini ayrı bir değişkene nasıl atayabilirim. 1 örnek verebilirmisiniz. Ayrı bir konu başlığı açacaktım ama konu başlığına ne yazabileceğime karar veremedim.

Hepsini ayrı değişkene atamanıza gerek yok. Listenin elemanlarına tam sayı indexler ile erişebilirsiniz zaten.

Evet bunu biliyorum ama sn @aib tarafından yazılan kodda bunu yapamadım o yüzden sordum.

balcomb2 fonksiyonu bir liste döndürüyor.

Yapamadığım zaten o listenin elemanlarına sıra ile erişmek. Arsenal Barcelona olmasi gerekirken Liverpool Manchester sonucunu veriyor. Ekran çıktısı ile Liste elemanlarının sırası farklı çıkıyor. Bu yüzden
#print("\n".join(map(str, sorted(balcomb2(teams))))) satırını sildim ve önce listenin elemanlarına erişip sonra prınt alınca sorunum halloldu teşekkür ederim.


macListesi = balcomb2(teams)

print("mac_1 : ", macListesi[0])

Screenshot_4

Bu sorted farklı çıktı almanıza sebep oldu sanırım.