【问题标题】:How to deal with different size lists in python and indexes (List indexes)如何处理python和索引中不同大小的列表(列表索引)
【发布时间】:2018-12-05 04:53:04
【问题描述】:

我正在编写一个 python 脚本并且对一些与列表相关的逻辑感到困惑。 我有 2 个列表 PrizeList ,其中包含奖品元素,以及一个包含获胜者元素的获胜者列表。 对于获胜者列表中的每个元素,我都希望将奖品元素与之关联。

我有两个方法:distributePrizes 包含这个逻辑和 sendEmail 方法,它是从distributePrizes 方法调用的。

我遇到的问题是,当每个获胜者没有足够的奖品时,脚本会在第一次检查后停止。

有三种可能的情况: 1. 足够数量的奖品。在这种情况下,调用 emailWinners 方法。 2.奖品比得奖者少。为每个与奖品匹配的获胜者致电 emailWinners。 3.没有奖品。在这种情况下输出一个错误。

我不确定如何为每个与奖品匹配的获胜者调用 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)

【问题讨论】:

  • 不清楚你的问题是什么
  • 您想将奖品分配给每位获奖者,但如果奖品不够,那就行不通了.. 购买更多奖品?你希望发生什么?
  • 对造成的混乱表示歉意。有三种可能的情况, 1. 每个人都有足够的奖品 -> 调用 emailWinners 方法。 2. 没有足够的奖品 -> 通过电子邮件发送与有奖品相同数量的获奖者。 3.没有奖品,输出错误。

标签: python list


【解决方案1】:

您通常会使用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}')

【讨论】:

    【解决方案2】:

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

    if len(prizeList) > len(emailList):
    

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

    写这篇文章的人可能应用了这个检查,以便从那时起可以做出“每个人都有足够的奖品”的假设。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-12-23
      • 1970-01-01
      • 2016-06-24
      • 1970-01-01
      • 2021-12-17
      • 1970-01-01
      • 2015-04-25
      • 1970-01-01
      相关资源
      最近更新 更多