如何处理python中不同大小的列表和索引(列表索引)

2024-09-30 18:34:04 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在写一个python脚本,对一些与列表相关的逻辑感到困惑。 我有两个列表prizeList包含奖品元素,和一个获奖者名单包含获奖者元素。 对于winnerList中的每个元素,我想将一个prize元素与之关联。你知道吗

我有两个方法:包含此逻辑的distributePrizes和从distributePrizes方法调用的sendEmail方法。你知道吗

我遇到的问题是,当没有足够的奖品给每位获奖者时,剧本会在第一次检查后停止。你知道吗

有三种可能的情况: 1有足够的奖品奖励得奖者。在这种情况下,调用emailWinners方法。 2.奖品少于获奖者。给每一个与奖品匹配的获胜者打电话。 三。没有奖品。在这种情况下,输出一个错误。你知道吗

我不知道如何调用emailWinners方法为每一个获奖者匹配的奖品。当prizeList和winnerList的大小不同时,我尝试为每个获胜者调用emailWinner时会出现索引越界错误。你知道吗

例如(winnerList[]=长度5,prizeList[]=长度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)

Tags: to方法元素forlenprizeprizes奖品
2条回答

您通常会对这样的东西使用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}')

这是预期的行为,因为检查

if len(prizeList) > len(emailList):

检查prizelist是否大于电子邮件列表。if语句没有else语句,因此脚本在len(prizelist) <= len(emailList)时停止

无论是谁写的这篇文章,很可能应用了这个检查,这样就可以从那时起假设“每个人都有足够的奖品”。你知道吗

相关问题 更多 >