ValarMayar
@ValarMayar
Д У Р А Ч О К / недопрограммист графоман

Как правильно разбить лист?

Добрый день.
Суть:
Есть лист с почтами получателей такого вида
receiver = ['receiver1@mail.ru', 'receiver2@mail.ru', 'receiver3@mail.ru', 'receiver4@mail.ru', 'receiver5@mail.ru']


Есть лист с почтами отправителей
такого же вида

sender = ['sender1@mail.ru', 'sender@mail.ru', 'sender3@mail.ru', 'sender4@mail.ru', 'sender5@mail.ru']


Как мне правильно разбить лист с получателями относительно кол-ва отправителей
Сейчас есть такая функция:

def split_list(main_list, wanted_parts):
    """ Функция делит базу получателей на части"""
    length = len(main_list)
    return [main_list[i * length // wanted_parts: (i + 1) * length // wanted_parts] for i in
            range(wanted_parts)]  # возвращает лист со вложенными листами
#  С этой функции мы собираем листы с майлами(отправители и получатели) и отправляем на обработку в split list
def my_func():
   receiver = ['receiver1@mail.ru', 'receiver2@mail.ru', 'receiver3@mail.ru', 'receiver4@mail.ru', 'receiver5@mail.ru']
   sender = ['sender1@mail.ru', 'sender@mail.ru']
   total_receiver_account = len(receiver) # кол-во получателей
   total_sender_account = len(sender) # кол-во отправителей
   #  привожу к int, тк остается остаток(1) тут то и находится моя проблема, ведь я не могу разделить список на 2,5(может и могу, но ума не хватает)
   print(split_list(receiver, int(total_receiver_account/total_sender_account)))
   {
      'sender1@mail.ru': ['receiver1@mail.ru', receiver2@mail.ru'],
     'sender2@mail.ru': ['receiver3@mail.ru', 'receiver4@mail.ru']
   }


В сущности функция работает, но есть очевидные проблемы с логикой, например, если получим в результате деления float
receiver_count = 23
 sender_count = 3
 result = receiver_count/ sender_count
 result = 7.666666666666667


Как мне описать данную логику, что бы не терялись почты в процессе деления.
PS необязательно что бы разделенные списки были равными, мне как раз надо в какой то из списков дописать остаточные почты, ну или раскидать по всем
Спасибо
  • Вопрос задан
  • 94 просмотра
Решения вопроса 1
kshnkvn
@kshnkvn Куратор тега Python
yay ✌️ t.me/kshnkvn
import numpy as np

def split_receivers(receivers, senders):
    count_for_sender = int(len(receiver) / len(sender))
    chunk_count = int(len(receivers) / count_for_sender)

    chunked_receivers = np.array_split(receivers, chunk_count)

    return {s: r.tolist() for s, r in zip(senders, chunked_receivers)}

receiver = ['receiver1@mail.ru', 'receiver2@mail.ru', 'receiver3@mail.ru', 'receiver4@mail.ru', 'receiver5@mail.ru']
sender = ['sender1@mail.ru', 'sender@mail.ru']

split_receivers(receiver, sender)
# {'sender1@mail.ru': ['receiver1@mail.ru', 'receiver2@mail.ru', 'receiver3@mail.ru'], 'sender@mail.ru': ['receiver4@mail.ru', 'receiver5@mail.ru']}


Без зависимостей:
def split_list(l: list, n: int):
    return [l[i::n] for i in range(n)]

receivers = [f'receiver{i}@mail.ru' for i in range(77)] # 77 получателей
senders = [f'sender{i}@mail.ru' for i in range(5)] # 5 отправителей

chunked_receivers = split_list(receivers, len(senders))
result = {s: r for s, r in zip(senders, chunked_receivers)}
Ответ написан
Пригласить эксперта
Ответы на вопрос 1
@remzalp
Программер чего попало на чем попало
Неравномерный вариант - целочисленное деление:
result = receiver_count // (sender_count - 1)
а сдачу последнему sender:
ost = receiver_count % (sender_count - 1)

Равномерный вариант:
крутитесь в цикле по отправителям, считаете скольким отправили, пока меньше чем receiver_count/sender_count.
Как только превысили - переходим к следующему
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы