Как работать со списками разного размера в python и индексами (List indexes) - PullRequest
0 голосов
/ 04 декабря 2018

Я пишу скрипт на python и запутался в какой-то логике, связанной со списком.У меня есть 2 списка призового листа, который содержит элементы приза, и список победителей, содержащий элементы победителя.Для каждого элемента в winnerList я хочу связать с ним элемент выигрыша.

У меня есть два метода: distribtePrizes, который содержит эту логику, и метод sendEmail, который вызывается из метода distribtePrizes.

Проблема, с которой я сталкиваюсь, заключается в том, что при недостаточном количестве призов для каждого победителя сценарий останавливается после первой проверки.

Существует три возможных условия: 1. Достаточно призов для количества победителей.В этом случае вызовите метод emailWinners.2. Меньше призов, чем есть победители.Назовите emailWinners для каждого победителя, которому соответствует приз.3. Нет призов.В этом случае выведите ошибку.

Я не уверен, как вызвать метод emailWinners для каждого победителя, которому назначен приз.Я получаю ошибки индексации при попытке вызвать emailWinner для каждого победителя, когда призовые листы и списки победителей имеют разные размеры.

например, (winnerList [] = длина 5, призовой список [] = длина 3. Следует отправить 3 победителей с призом, но вместо этого получить ошибку индексации за пределами границ.)

Вот что я пробовалдо сих пор:

 if len(prizeArray) < len(winnerEmail):

    # Not enough prizes for every winner

    print("Not enough prizes for " + prizeType)  # Alert if not enough prizes

    for email in winnerEmail:
        emailUserWithPrize(winnerEmailAddress, winnerPrize)

winnerEmailAddress = ""
winnerPrize = ""
for i in range(len(winnerEmail)):

    # For every prize thats available, assign one email to it

    winnerEmailAddress = winnerEmail[i]

    # Assign an email from the list to a prize from the list

    if i < len(prizeArray):

        winnerPrize = prizeArray[i]

        prizeArray.remove(winnerPrize)

        # Write array content to prize file, essentially removing used prizes

        openFile.close()  # Should delete all content

        writeToFile = open(prizeFile, 'w')

        writeToFile.write(prizeArray[i])  # Should write remaining prizes back to file





    else:

        print("No prize available for " + winnerEmail[i])

    # print(winnerEmailAddress, " won ", winnerPrize)

    # also need to remove this entry from prize file

    emailUserWithPrize(winnerEmailAddress, winnerPrize)

Ответы [ 2 ]

0 голосов
/ 04 декабря 2018

Обычно вы используете функцию zip для подобных вещей.Например:

import re
import random
p = re.compile(r'^\w+@\w+\.\w+$')

prizes = ['blender', 'car', 'pencils', 'tablet']
emails = ['', 'sjadhgf', 'bob@bob.com', 'jack@bob.com',
          'jenny@bob.com', 'frank@google.com', 'someone@gmail.com',
          'other@other.com', 'runner@xxx.co']

valid_emails = [e for e in emails if p.match(e)]
random.shuffle(valid_emails)

for winner, prize in zip(valid_emails, prizes):
    print(f'{prize} goes to {winner}')
0 голосов
/ 04 декабря 2018

Это ожидаемое поведение, так как проверка

if len(prizeList) > len(emailList):

Проверяет, больше ли список призеров, чем список адресов электронной почты.Этот оператор if не имеет оператора else, и поэтому сценарий останавливается, когда len(prizelist) <= len(emailList)

Кто бы это ни написал, вероятно, применил эту проверку, чтобы с этого момента можно было сделать предположение «для каждого достаточно призов».

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...