簡體   English   中英

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

[英]How to deal with different size lists in python and indexes (List indexes)

我正在編寫一個python腳本,並對一些與列表相關的邏輯感到困惑。 我有2個列表獎項列表,其中包含獎賞元素,以及一個獲獎者列表,其中包含獲勝者元素。 對於winnerList中的每個元素,我想將一個獎賞元素與其關聯。

我有兩個方法:包含此邏輯的distributionPrizes和從distributionPrizes方法調用的sendEmail方法。

我遇到的問題是,當沒有足夠的獎金給每個獲勝者時,腳本會在第一次檢查后停止。

存在三個可能的條件:1.獲獎者數量足以獲獎。 在這種情況下,請調用emailWinners方法。 2.獎品少於獲獎者。 對於每個與獎品相匹配的獲獎者,請致電emailWinners。 3.沒有獎品。 在這種情況下,輸出錯誤。

我不確定如何為每個與獎項匹配的獲獎者調用emailWinners方法。 當prizeList和winnerList大小不同時,嘗試為每個獲獎者調用emailWinner時,出現索引錯誤。

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

您通常會使用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):

檢查獎品列表是否大於電子郵件列表。 該if語句沒有else語句,因此當len(prizelist) <= len(emailList)時,腳本停止

無論是誰撰寫的,都可能會應用此檢查,以便從那時起就可以做出“每個人都有足夠的獎品”的假設。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM