繁体   English   中英

字典值打印出不寻常/奇怪的数字

[英]Dictionary Values Printing Out Unusual/Weird Numbers

我试图解决关于 codechef 的问题( https://www.codechef.com/problems/UCL ),我很困惑为什么打印的数字完全不正确,我真的不知道这些数字是怎么来的成为。

我在这里有一个输入文件:input.txt

2
manutd 8 vs. 2 arsenal
lyon 1 vs. 2 manutd
fcbarca 0 vs. 0 lyon
fcbarca 5 vs. 1 arsenal
manutd 3 vs. 1 fcbarca
arsenal 6 vs. 0 lyon
arsenal 0 vs. 0 manutd
manutd 4 vs. 2 lyon
arsenal 2 vs. 2 fcbarca
lyon 0 vs. 3 fcbarca
lyon 1 vs. 0 arsenal
fcbarca 0 vs. 1 manutd
a 3 vs. 0 b
a 0 vs. 0 c
a 0 vs. 0 d
b 0 vs. 0 a
b 4 vs. 0 c
b 0 vs. 0 d
c 0 vs. 0 a
c 0 vs. 0 b
c 1 vs. 0 d
d 3 vs. 0 a
d 0 vs. 0 b
d 0 vs. 0 c

这是我打印出奇怪数字的代码:

fh = open('competitiveProgrammingInput.txt', "r")
tc = int(fh.readline())

for i in range(tc):
    teamsList = {}
    highest = 0
    for i in range(12):
        homeScore = 0
        awayScore = 0
        li = fh.readline().split()
        home, homeG, awayG, away = li[0], int(li[1]), int(li[3]), li[4]

        if homeG > awayG:
            homeScore = 3
            awayScore = 0
        elif awayG > homeG:
            awayScore = 3
            homeScore = 0
        elif awayG == homeG:
            homeScore = 1
            awayScore = 1

        homeDifference = homeG - awayG
        awayDifference = awayG - homeG


        if home in teamsList:
            homeDifference = homeDifference + teamsList[home][1]
            homeScore += teamsList[home][0]
            del teamsList[home]
            newD = {home: [homeScore, homeDifference]}
            teamsList[home] = [homeScore, homeDifference]
        else:
            teamsList[home] = [homeScore, homeDifference]

        if away in teamsList:
            awayDifference = awayDifference + teamsList[away][1]
            awayScore = awayDifference + teamsList[away][0]
            del teamsList[away]
            newD = {away: [awayScore, awayDifference]}
            teamsList[away] = [awayScore, awayDifference]
        else:
            teamsList[away] = [awayScore, awayDifference]

    print(teamsList)

具体来说,是homeScoreawayScore值不起作用。

为了给你一些背景,这个问题是获得足球锦标赛的排名,输入的格式类似于主队,主队进球,'vs',客队进球,客队进球多的人得到+3分。 那就是 awayScore 和 homeScore 变量。

公布的数字与我能想到的任何事情都没有关联。

非常感谢你的帮助。

这里有几点:

  • 为什么要从字典中删除键,然后再将它们添加回来? 您不必这样做,因为值应该更新。
  • 你为什么要设置newD 你没有在任何地方使用它。

至于您的实际问题,您正在使用awayDifference更新awayScore ,因此该行可能应该如下所示:

awayScore += teamsList[away][0]

不过,我怀疑这不是您唯一的问题。 您在问题中说获胜的球队得分为+3,但如果比赛结果为平局,他们也会获得+1。 此外,你的分差对输的球队来说是负数。 这些值是预期的吗?

但是,您的代码架构很奇怪,因为您使用这些值来修改其他值,然后覆盖原始值。 要获取代码的“离开”分支,也许您应该像这样尝试:

if away in teamsList:
    teamsList[away][1] += awayDifference
    teamsList[away][0] += awayScore
else:
    teamsList[away] = [awayScore, awayDifference]

然后你可以对“home”分支做同样的事情。

但是,这不是最佳实践,因为很容易混淆哪个索引对应于“分数”与“差异”。 事实上,这就是让你在这里绊倒的原因。 相反,我会添加一个 class:

class TeamEntry:

    def __init__(self, score, difference):
        self.Score = score
        self.Difference = difference

    def Add(self, score, difference):
        self.Score += score
        self.Difference += difference

然后,您“离开”的分支将如下所示:

if away in teamsList:
    teamsList[away].Add(awayScore, awayDifference)
else:
    teamsList[away] = TeamEntry(awayScore, awayDifference)

这更清洁。

对原始代码进行代码修复

代码

fh = open('competitiveProgrammingInput.txt', "r")
tc = int(fh.readline())

for i in range(tc):
    teamsList = {}
    highest = 0
    for i in range(12):
        homeScore = 0
        awayScore = 0
        li = fh.readline().split()
        home, homeG, awayG, away = li[0], int(li[1]), int(li[3]), li[4]

        if homeG > awayG:
            homeScore = 3
            awayScore = 0
        elif awayG > homeG:
            awayScore = 3
            homeScore = 0
        elif awayG == homeG:
            homeScore = 1
            awayScore = 1

        homeDifference = homeG - awayG
        awayDifference = awayG - homeG

        if home in teamsList:
            homeDifference += teamsList[home][1]
            homeScore += teamsList[home][0]
            teamsList[home] = [homeScore, homeDifference]
        else:
            teamsList[home] = [homeScore, homeDifference]

        if away in teamsList:
            awayDifference += teamsList[away][1]
            awayScore += teamsList[away][0]
            teamsList[away] = [awayScore, awayDifference]
        else:
            teamsList[away] = [awayScore, awayDifference]

    # Sort by points then by goal difference
    results = sorted(teamsList.items(), key=lambda kv: tuple(kv[1]), reverse=True) 
    # Print first two names of results (since sorted in descending order)
    print(*[name for name, value in results[:2]])

Output

manutd fcbarca
d b

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM