# ---
# jupyter:
#   jupytext:
#     text_representation:
#       extension: .py
#       format_name: light
#       format_version: '1.5'
#       jupytext_version: 1.14.4
#   kernelspec:
#     display_name: Python 3
#     language: python
#     name: python3
# ---

# +
from collections import defaultdict
from random import shuffle

artist=['소녀시대','소녀시대','BTS','BTS','Muse','Muse','Dream','Dream']
music=['다시 만난 세계','Gee','DNA','Fire','PIB','Panic Room','Take the time','Pull me under']
box=defaultdict(list)
for i, arti in enumerate(artist):
    box[arti].append(music[i])

pair=[]
for i,j in box.items():
    for k in j:
        pair.append([i, k])

pair=[]
for i,j in box.items():
    for k in j:
        pair.append([i, k])

while 1:
    shuffle(pair)
    playlist=[]
    for i in range(len(pair)-1):
        if pair[i][0]==pair[i+1][0]:
            break
    else: break
[i[1] for i in pair]
            

# +
from collections import defaultdict
from random import shuffle
import random

artist=['소녀시대','소녀시대','BTS','BTS','Muse','Muse','Dream','Dream']
music=['다시 만난 세계','Gee','DNA','Fire','PIB','Panic Room','Take the time','Pull me under']
box=defaultdict(list)
for i, arti in enumerate(artist):
    box[arti].append(music[i])
    
# pair=[]
# for i,j in box.items():
#     for k in j:
#         pair.append([i, k])

# shuffle(pair)

playlist=[]
for i in box.keys():
    playlist.append(random.sample(box[i]))
playlist

# for i in range(len(pair)):
#     if pair[i-1][0] != pair[i][0] and pair[i][1] not in playlist:
#         playlist=

# playlist=[]
# playlist.append(pair[0][1])
# while 1:
#     for i in range(len(pair)):
#         if pair[i-1][0] != pair[i][0] and pair[i][1] not in playlist:
#             playlist
#             print(playlist)
#             pair.pop(i)
# playlist

# -

dic={1:['a','b','c']}
ls=[1,2,3,4]
ls.random.sample()

# +

from collections import defaultdict, Counter
import random

# artist = ['소녀시대'] * 10 + ['BTS'] * 8 \
#        + ['아이유'] * 17 + ['볼빨간 사춘기'] * 14
# music = [f'소녀시대{i+1}' for i in range(10)] \
#       + [f'BTS{i+1}' for i in range(8)] \
#       + [f'아이유{i+1}' for i in range(17)] \
#       + [f'볼빨간 사춘기{i+1}' for i in range(14)]

artist = ['소녀시대'] * 2 + ['BTS'] * 2 \
       + ['아이유'] * 5
music = [f'소녀시대{i+1}' for i in range(2)] \
      + [f'BTS{i+1}' for i in range(2)] \
      + [f'아이유{i+1}' for i in range(5)]

box = defaultdict(list)
for i, arti in enumerate(artist):
    box[arti].append(music[i])

# 가수들의 노래를 섞어줌
for i in box.keys(): random.shuffle(box[i])
# 셔플 완료된 노래를 담을 변수
playlist = []
# 전체 노래의 수
all_cnt = len(eval('+'.join(f'{i}' for i in box.values())))
# 가수들 목록
artist_list = list(box.keys())
# 현재 선택된 가수와 노래 리스트를 담을 변수
select_artist = select_songs = None
# 이전에 선택된 가수와 노래 리스트를 담을 변수
select_artist_ = select_songs_ = None
# 전체 노래의 수만큼 반복하며 매 반복마다 노래 하나를 선택
try:
    for _ in range(all_cnt):
        # 가장 곡 수가 많은 가수가 마지막에 남는 것을 방지하기 위해
        # 곡 수가 가장 많은 가수의 노래를 우선적으로 플레이리스트에 추가
        song_cnt = eval('+'.join([f'{[k] * len(v)}' for k, v in box.items()]))
        # 동일한 곡 수의 가수들 중에 랜덤 선택하기 위해 셔플
        random.shuffle(song_cnt)
        # 가수별 곡 수 카운팅
        by_artist = Counter(song_cnt).most_common(len(artist_list))
        # 만약 곡 수가 가장 많은 가수의 곡 수가
        # 나머지 가수들 곡 수의 합보다 클 경우
        # 그 가수의 곡을 우선적으로 선곡
        if by_artist[0][1] > sum([by_artist[i][1] for i in range(1, len(by_artist))]):
            select_artist = Counter(song_cnt).most_common(1)[0][0]
        # 나머지 가수들 곡 수의 합이 클 경우
        # 전체 곡들 중 선곡
        else: select_artist = random.choice([i[0] for i in by_artist])
        # 선택된 가수를 리스트에서 삭제
        artist_list.remove(select_artist)
        # 그 가수의 노래들을 dictionary에서 꺼냄
        select_songs = box.pop(select_artist)
        # 노래 목록에서 노래 하나를 선택해서 플레이리스트에 추가
        # 이 때, 이미 처음에 노래 목록을 섞었기 때문에
        # 랜덤하게 뽑지않고 첫 번째 노래를 선택
        playlist.append(select_songs.pop(0))
        # 남은 곡이 없을 경우 해당 가수는 다음에 뽑지 않아도 되므로
        # 현재 선택된 가수와 노래 리스트 변수를 초기화해줌
        if not select_songs: select_artist = select_songs = None
        # 만약 이전에 선택된 가수가 있을 경우 다음 선택에는
        # 그 가수가 선택될 수 있어야 하므로
        # 가수 리스트와 dictionary에 추가
        if select_artist_: 
            artist_list.append(select_artist_)
            box[select_artist_] = select_songs_
        # 선택된 가수의 노래 목록 리스트를 새로운 변수에 옮김
        select_artist_, select_songs_ = select_artist, select_songs
    print('\n'.join(playlist))
# 셔플이 불가능할 경우
except: print('불가능합니다.')
# -



StarcoderdataJupyterScriptsDedupFiltered