我正在创建一个棋盘游戏排名系统,并且有一个.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
例如,约翰击败了阿曼达,而阿曼达击败了乍得,因此我们需要添加一条约翰击败乍得的条目。
答案 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
模块。建立图表,将每个玩家表示为一个节点,将每个游戏表示为从赢家到输家的边缘。
现在,找到不败玩家的节点很简单。按照每个可用的路径进行操作,记录每对可能的获胜者-失败者传递性。跟踪路径上您访问过的所有节点;每个访问过的节点都会击败您以后遇到的任何节点。
就足以让您动起来吗?