【发布时间】:2019-05-13 20:54:50
【问题描述】:
我正在创建一个脚本来对游戏系统的赢家和输家进行排序。我有一个击败过其他玩家的玩家列表,这些玩家会因任何被他们击败的人击败过的玩家而获得荣誉。该脚本会找到这些玩家并给予顶级获胜者荣誉。
我正在抓取一个 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))
【问题讨论】:
-
在这个例子中,当输入文件中没有出现该拼写时,您是如何将
@Brandon(带有大写“B”)作为文件输出的? -
手动输入并按下 shift 键。
标签: python python-2.7 csv