游戏排名系统:找到击败人们的人:如何组织此csv数据并附加文件?

时间:2019-05-07 18:10:49

标签: python csv

我正在创建一个棋盘游戏排名系统,并且有一个.CSV列表,其中列出了在棋盘游戏之夜击败其他人的人。殴打打败别人的人算是胜利。我需要抓取此CSV文件,找到被优胜者击败的人打败的人,然后附加该数据并对其进行排序。

我可以打开,创建和获取数据并写入文件,但是当我尝试编写各种版本的代码时,我似乎无法完全正确地输出输出。

 import csv
 import collections

 #get the contents of the input.csv file
 WINLOSE = {}
 with open('input.csv') as f2:
     for line in f2:
         winners,losers = line.strip().split(',')
         WINLOSE[winners] = losers

 new_items = set()
 RESULTS = collections.namedtuple('RESULTS', ['winners', 'losers'])

 #Write to the output file.
 with open('output.csv', 'w') as f1:
     writer = csv.DictWriter(winners, losers)

 #pseudo code -- if any name in the winner cell appears in the 
 #loser cell,
 #copy all of the losers associated with that cell to the people 
 #who beat that
 #cell

     if cell.losers = any-cell.winners:
         append the losers associated with the winners cell
         for row in new_items:
             writer.writerow(row._asdict())

输入的csv看起来像这样:

 Winners,Losers
 John,Amanda
 Mark,Eddy
 Amanda,Chad
 Becky,Michael
 Michael,Steve
 Eddy,Fred
 Michael, Stuart
 Edwardo, Patricia
 Michael, Buzz
 Mark, Charlie 
 Amanda, Brandon
 Brandon, Dirk

输出的csv应该如下所示:

 Winners,Losers
 John,Amanda
 John,Chad
 John, Brandon
 John, Dirk
 Mark,Eddy
 Mark,Fred
 Mark, Charlie
 Amanda,Chad
 Becky,Michael
 Becky,Steve
 Michael,Steve
 Michael, Stuart
 Michael, Buzz
 Eddy,Fred
 Edwardo, Patricia
 Amanda, Brandon
 Brandon, Dirk

例如,约翰击败了阿曼达,而阿曼达击败了乍得,因此我们需要添加一条约翰击败乍得的条目。

2 个答案:

答案 0 :(得分:1)

您可以构建一个将每个获胜者映射到失败者列表的字典,遍历该字典的键/获胜者,使用生成器函数递归地产生获胜者的失败者并输出结果获胜者/失败者对: / p>

import csv

def find_losers(winner, results):
    for loser in results.get(winner, ()):
        yield loser
        for child in find_losers(loser, 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 in reader:
        results.setdefault(winner, []).append(loser)
    for winner in results:
        for loser in find_losers(winner, results):
            writer.writerow((winner, loser))

使用示例输入,输出文件将包含:

Winners,Losers
John,Amanda
John,Chad
John,Brandon
John,Dirk
Mark,Eddy
Mark,Fred
Mark,Charlie
Amanda,Chad
Amanda,Brandon
Amanda,Dirk
Becky,Michael
Becky,Steve
Becky,Stuart
Becky,Buzz
Michael,Steve
Michael,Stuart
Michael,Buzz
Eddy,Fred
Edwardo,Patricia
Brandon,Dirk

答案 1 :(得分:1)

在有向无环图(DAG)中找到所有可能的起始路径时,这是一个问题。

您发布的代码的问题在于,字典必须具有唯一键;当您添加Mark: John,然后再添加Mark: Ted时,第一个图形关系被删除。这不是一个很好的图形结构。

我建议使用igraph模块。建立图表,将每个玩家表示为一个节点,将每个游戏表示为从赢家到输家的边缘。

现在,找到不败玩家的节点很简单。按照每个可用的路径进行操作,记录每对可能的获胜者-失败者传递性。跟踪路径上您访问过的所有节点;每个访问过的节点都会击败您以后遇到的任何节点。

就足以让您动起来吗?