【问题标题】:Game ranking system: Problems adding email游戏排名系统:添加电子邮件的问题
【发布时间】: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


【解决方案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])

... 这将在results 中的获胜者条目中附加一个 2 元素列表。 将为您提供稍后提取电子邮件的信息。

【讨论】:

  • 我修复了悬空的表情,谢谢。您能否让我指出正确的方向,使用 dict 从每一行获取数据,而不是仅输出最后一次阅读的电子邮件?
  • 有多种方法可以做到;通过字典教程工作?我会使用播放器作为键,电子邮件作为值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-19
  • 1970-01-01
相关资源
最近更新 更多