社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

python zip函数从文件中删除太多项

Paul • 5 年前 • 1513 次点击  

我从一个文本文件中读取内容并将其存储在一个列表中(每行作为一个元素)(prizelist)。我也在为Winnerlist做同样的事情,这是另一个列表。

im使用一个zip函数来调用emailuser函数,每次赢家和电子邮件都存在于同一索引中。如果索引中不存在至少一个元素,则循环将停止。

调用该函数后,从列表中删除该奖品,从文件中删除所有内容,然后将列表内容写回文本文件(本质上是删除该元素)。

问题是要么 prizeList.remove(prize) writeTo.write(prizes) 正在从文本文件中删除太多内容。除了在循环中每次迭代删除一个元素(从TXT文件)之外,它还删除了更多的元素。

以下是我的尝试:

   for prize, winner in zip(prizeList, emailList):


    print(f'{prize} goes to {winner}')


    emailUserWithPrize(winner, prize, prizeType)

    print("Before: ")
    print(prizeList)

    prizeList.remove(prize)

    file.close()

    writeTo = open(prizeFile, "w")

    prizes = ""
    for i in range(len(prizeList)):
        prizes = prizeList[i]

    writeTo.write(prizes)



    print("After:")
    print(prizeList)

if len(prizeList) < 1:
    print("No more prizes for " + prizeType)
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/43213
 
1513 次点击  
文章 [ 2 ]  |  最新文章 5 年前
Alex Bogomolov
Reply   •   1 楼
Alex Bogomolov    6 年前

让我们试着解构你的代码。 你在奖品列表和电子邮件列表的第一项中找到匹配项,对吗?然后从奖品列表中删除每个给定的奖品。然后,如果您还有任何奖品,您可以将其添加到奖品文件中。

prize_list = ['p1', 'p2', 'p3', 'p4', 'p5', 'p6']
email_list = ['e1', 'e2', 'e3', 'e4']

matches = list(zip(prize_list, email_list))

for prize, winner in matches:
    print(f'{prize} goes to {winner}')
    print("Before: ", prize_list)
    print('removing', prize)
    prize_list.remove(prize)
    print('{} prizes left'.format(len(prize_list)))

prize_file = 'prizeFile.txt'
with open(prize_file, "w") as file_:
    for prize in prize_list:
        file_.write(prize)
        file_.write('\n')

输出:

p1 goes to e1
Before:  ['p1', 'p2', 'p3', 'p4', 'p5', 'p6']
removing p1
5 prizes left
p2 goes to e2
Before:  ['p2', 'p3', 'p4', 'p5', 'p6']
removing p2
4 prizes left
p3 goes to e3
Before:  ['p3', 'p4', 'p5', 'p6']
removing p3
3 prizes left
p4 goes to e4
Before:  ['p4', 'p5', 'p6']
removing p4
2 prizes left
After: ['p5', 'p6']
ShlomiF
Reply   •   2 楼
ShlomiF    6 年前

似乎你无意中截断了一个列表(或者 prizeList emailList )因为 zip 只在一个输入列表(更多通用迭代器)完成之前迭代, as documented .
当然,你可以通过打印每个列表的长度来检查,但我猜这就是你问题的根源。
解决 问题是,取决于你到底想做什么,而我不能根据你的代码猜得足够多。
祝你好运!


由于注释而更新:如果您担心无法正确读取和/或写入文本文件,则这是另一个问题,应作为单独的工作进行检查和调试。