Найти - Пользователи
Полная версия: Распределить данные в ячейках массива
Начало » Python для новичков » Распределить данные в ячейках массива
1 2
Ahmasoft
Есть массив в котором 36 элементов, при чем некоторые из них схожи (количество различных элементов разное). Элементы упорядочены: A A B B B C…N N. Как сделать так чтобы в вот этих диапазонах: (0,5)(6,11)(12,17)(18,23)(24,29)(30,35) не было схожих элементов ? Обломался с random.shuffle)
Shaman
Замешивать уникальные и неуникальные отдельно, а затем компоновать?
doza_and
Shaman
Замешивать уникальные и неуникальные
Круто, вы просто экстрасенс 100 Уровня. У меня даже гипотез нет о том какой смысл в поставленном вопросе.
Shaman
Когда и гипотез нет - дела совсем плохи. У меня гипотезы были, целых несколько. Ответил, отталкиваясь от самой вероятной, а неуверенность в ответе выразил вопросительной формой предложения.
Ahmasoft
Короче вот весь код:
#составитель расписания
#в день 6 уроков
#36 уроков в неделю 
# -*- coding:utf8 -*-
import random
g = int(input("Введите кол-во предметов в неделю: "))
a = []
week = []
pn = []; vt = []; sr = []; ct = []; pt = []; sb = []
b = c = d = 0
while b < g :
    a.append(raw_input("Введите название предмета: "))
    a.append(int(input("Сколько раз он должен быть в неделю ?: ")))
    b = b + 1
b = 0
while b <= g:
    d = 0
    while d < a[c + 1]:
        week.append(a[c])
        d += 1
    if c + 1 == g * 2 - 1:
        break
    else:
        c += 2
    b += 1
b = d = 0
c = 5
while b < 6:
    while d < c:
        if week[d] == week[d+1]:
            random.shuffle(week)
            if week[d] == week[d-5]:
                random.shuffle(week)
        elif week[d] == week[d+2]:
            random.shuffle(week)
            if week[d] == week[d-4]:
                random.shuffle(week)
        elif week[d] == week[d+3]:
            random.shuffle(week)
            if week[d] == week[d-3]:
                random.shuffle(week)
        elif week[d] == week[d+4]:
            random.shuffle(week)
            if week[d] == week[d-2]:
                random.shuffle(week)
        elif week[d] == week[d+5]:
            random.shuffle(week)
            if week[d] == week[d-1]:
                random.shuffle(week)
        d += 1
    c = c + 5
    b += 1
b = d = 35
def days(l):
    global b
    global d
    while b > d-6:
        l.append(week[b-1])
        b -= 1
        if b < 0:
            break
    d = d - 6
days(pn); days(vt); days(sr); days(ct); days(pt); days(sb)
print(pn)
print(vt)
print(sr)    
print(ct)
print(pt)
print(sb)
Не ругайте за нерациональное использование переменных, скоро исправлю.
Вот этот вот фрагмент почти работает:
while o < 6:
    while d < m:
        if week[d] == week[d+1]:
            random.shuffle(week)
            if week[d] == week[d-5]:
                random.shuffle(week)
        elif week[d] == week[d+2]:
            random.shuffle(week)
            if week[d] == week[d-4]:
                random.shuffle(week)
        elif week[d] == week[d+3]:
            random.shuffle(week)
            if week[d] == week[d-3]:
                random.shuffle(week)
        elif week[d] == week[d+4]:
            random.shuffle(week)
            if week[d] == week[d-2]:
                random.shuffle(week)
        elif week[d] == week[d+5]:
            random.shuffle(week)
            if week[d] == week[d-1]:
                random.shuffle(week)
        d += 1
    m = m+5
    o += 1
Но обязательно в одном диапазоне найдутся хотя бы 2 одинаковых элемента, и я уже заведомо думал что он будет работать даже хуже. Но думаю если вот здесь правильно пошаманить, то все будет прекрасно:
while b < g :
    a.append(raw_input("Введите название предмета: "))
    a.append(int(input("Сколько раз он должен быть в неделю ?: ")))
    b = b + 1
b = 0
И ещё племянница подала идею хD. Заносить к примеру не 3 сразу подряд, а сначала 1 элемент, потом другой (отличающийся) и т.д пока 1 элемент не занесется 3 раза.
Ahmasoft
Надумал такое, переименовываем все массивы с названиями дней недели на l, m, n, o, p, q. А потом:
# -*- coding:utf8 -*-
import random
g = int(input("Введите кол-во предметов в неделю: "))
a = []
week = []
l = []; m = []; n = []; o = []; p = []; q = []
b = c = d = 0
while b < g :
    a.append(raw_input("Введите название предмета: "))
    a.append(int(input("Сколько раз он должен быть в неделю ?: ")))
    b = b + 1
b = 0
while b <= g: 
    d = 0 
    while d < a[c + 1]: 
        k = random.randint(1,6)
        if k == 1:
            k = l
        if k == 2:
            k = m 
        if k == 3:
            k = n
        if k == 4:
            k = o 
        if k == 5:
            k = p
        if k == 6:
            k = q 
        k.append(a[c]) 
        d += 1 
        if c + 1 == g * 2 - 1: 
            break 
        else: 
            c += 2 
    b += 1 
print(l)
print(m)
print(n)    
print(o)
print(p)
print(q)
Но вот этому фрагменту нужна доработка:
while b <= g: 
    d = 0 
    while d < a[c + 1]: 
        k = random.randint(1,6)
        if k == 1:
            k = l
        if k == 2:
            k = m 
        if k == 3:
            k = n
        if k == 4:
            k = o 
        if k == 5:
            k = p
        if k == 6:
            k = q 
        k.append(a[c]) 
        d += 1 
        if c + 1 == g * 2 - 1: 
            break 
        else: 
            c += 2 
    b += 1 
doza_and
Да зачем нам ваш код, который наверное не работает. Судя по тому что нет откликов никто не понимает что вы хотите сделать. Вы это по русски опишите.
Ahmasoft
Обижаете, работает. И я его не просто так показываю, а говорю что нужно доработать. Создаю составитель расписания. Пользователь сначала вводит количество различных предметов. Затем поочередно название предмета, и сколько раз он должен быть в неделю. Программа раскидывает эти значения по 6 дням, при чем в каждом дне не более 6 элементов. И кажется я уже понял как это сделать.
Shaman
# -*- coding:utf8 -*-
 
import random
 
days = [[] for _ in range(6)]
subjects = {'физика' : 12, 'химия' : 12, 'алгебра' : 12}
 
assert(sum(subjects.values()) <= len(days) * 6)
 
cursor = 0
for subj, count in subjects.items():
    for _ in range(count):
        days[cursor].append(subj)
        cursor = (cursor + 1) % len(days)
 
# опционально
for day in days:
    random.shuffle(day)
 
print(days)
Ahmasoft
Shaman, спасибо за попытку, но мне нужно было расскинуть не 3 предмета. А то количество кое введет пользователь.
This is a "lo-fi" version of our main content. To view the full version with more information, formatting and images, please click here.
Powered by DjangoBB