我正在创建一个脚本来对游戏系统的赢家和输家进行排序。我有一个击败其他玩家的玩家名单,这些玩家会为被击败的某人击败的任何玩家获得荣誉。这个脚本找到了那些球员,并给予了顶级赢家荣誉。
我正在抓取一个CSV文件,以查找被高层优胜者击败的人打败的人,然后附加该数据并对其进行排序。
该脚本可以正常工作,只有一个例外;由于某种原因,它仅复制一个看似随机的电子邮件地址并将其应用于输出中的所有行。为什么会发生这种情况,我该如何解决?
输入:
Winners,Losers,Email
John,Amanda,amanda@
Mark,Eddy,eddy@
Amanda,Chad,chad@
Becky,Michael,michael@
Michael,Steve,steve@
Eddy,Fred,fred@
Michael,Stuart,stuart@
Edwardo,Patricia,patricia@
Michael,Buzz,buzz@
Mark,Charlie,charlie@
Amanda,Brandon,brandon@
Brandon,Dirk,dirk@
当前(不良)输出:
Winners,Losers,Brandon@
John,Amanda,Brandon@
John,Chad,Brandon@
John,Brandon,Brandon@
John,Dirk,Brandon@
Mark,Eddy,Brandon@
Mark,Fred,Brandon@
Mark,Charlie,Brandon@
Amanda,Chad,Brandon@
Becky,Michael,Brandon@
Becky,Steve,Brandon@
Michael,Steve,Brandon@
Michael,Stuart,Brandon@
Michael,Buzz,Brandon@
Eddy,Fred,Brandon@
Edwardo,Patricia,Brandon@
Amanda,Brandon,Brandon@
Brandon,Dirk,Brandon@
所需输出=当前输出,但带有正确的失败者的电子邮件地址。
import csv
def find_losers(winner, results):
for loser in results.get(winner, ()):
yield loser
for child in find_losers(loser, results):
yield child
def find_email(loser, results):
for loser_email in results.get(loser, ()):
yield loser_email
for child in find_email(loser_email, results):
yield child
for loser_email in results.get(winner, ()):
yield loser_email
for child in find_losers(loser_email, results):
yield child
with open('output.csv', 'w') as f1, open('input.csv') as f2:
reader = csv.reader(f2)
writer = csv.writer(f1)
writer.writerow(next(reader))
results = {}
for winner, loser, loser_email in reader:
results.setdefault(winner, []).append(loser),
(loser_email)
for winner in results:
for loser in find_losers(winner, results):
writer.writerow((winner, loser, loser_email))
答案 0 :(得分:1)
我看不到您希望在那里有什么不同电子邮件。查看您的输出循环:
for winner in results:
for loser in find_losers(winner, results):
writer.writerow((winner, loser, loser_email))
loser_email
是循环不变式:您无需在循环中的任何位置进行更改。它具有上一个循环的最后一次迭代后剩余的任何值。这将是输入文件中处理的最后一封电子邮件。
如果您想为每个失败者提供相应的电子邮件,则必须在阅读它们时将它们存储起来,并将这些电子邮件放在相应的位置。使用给定的列表结构(如dict)或PANDAS数据框,可以轻松完成此操作。
此外,我不确定这段代码应该做什么:
for winner, loser, loser_email in reader:
results.setdefault(winner, []).append(loser),
(loser_email)
那个悬空的表达式(loser_email)
只是被求值,然后被忽略了-您无需对值做任何事情。也许你是说:
for winner, loser, loser_email in reader:
results.setdefault(winner, []).append([loser, loser_email])
...,这会将2个元素的列表附加到results
中的获奖者条目中。 此将为您提供信息,以便以后提取电子邮件。