【问题标题】:Any way to make this easier? Python有什么方法可以让这更容易吗? Python
【发布时间】:2021-12-02 06:50:19
【问题描述】:

这是一个 Python 问题,其中代码应该允许您输入 n 个姓名和分数,程序将返回分数第二低的人的姓名。这就是我想出的,它工作得非常好,但为了变得更好,我想知道是否有更简单的方法来实现这一点。我的代码如下。

n=int(input())
names=[]
for i in range(0,n):
    names.append([input(),float(input())])
for i in range(0,n):
    names[i].reverse()
names.sort()
names.reverse()
misc=[]
for i in range(0,n):
    misc.append(names[i][0])
blank=[]
for i in misc:
    if i not in blank:
        blank.append(i)
blank.reverse()
vals=[]
for i in range(0,n):
    if names[i][0]==blank[1]:
        vals.append(names[i])
vals.reverse()
for i in range(0,len(vals)):
    print(vals[i][1])

【问题讨论】:

  • 这个问题更适合codereview.stackexchange.com。请张贴在那里
  • 您可以使用misc = list(set(misc)) 快速删除重复项。但是你必须重新排序。在这种情况下,您不需要对名称进行排序。
  • @Goion:这个问题需要解决才能适合Code Review。您应该将提问者指向A guide to Code Review for Stack Overflow users,因为那里有些事情的处理方式不同 - 例如。我们需要很好地描述代码的用途以提供上下文,并且问题标题应该简单地说明代码做了什么(问题总是,“如何我可以改进吗?”)。代码正确运行很重要。如果可能,包括单元测试。

标签: python python-3.x loops


【解决方案1】:

首先,结构可以通过dicts大大简化。

从获取字典名称与分数开始。例如:

name_to_score = {
   "alice": 1.2,
   "bob": 1.1,
   "fred": 1.3,
   "nancy": 1.2,
}

然后获取该字典并将其反转以获得分数与名称的字典:

score_to_names = {
   1.2: ["alice", "nancy"],
   1.1: ["bob"],
   1.3: ["fred"],
}

您可以找到第二低的分数(键)并从倒排的字典中打印出值。

您的实现可能如下所示:

from collections import defaultdict

name_to_score = {}
for _ in range(int(input())):
    name_to_score[input()] = float(input())

score_to_names = defaultdict(list)
for name, score in name_to_score.items():
    score_to_names[score].append(name)

second_lowest_score = sorted(score_to_names.keys())[1]
print(score_to_names[second_lowest_score])

您也可以立即创建 score_to_names 字典:

from collections import defaultdict

score_to_names = defaultdict(list)
for _ in range(int(input())):
    name = input()
    score = float(input())
    score_to_names[score].append(name)

second_lowest_score = sorted(score_to_names.keys())[1]
print(score_to_names[second_lowest_score])

【讨论】:

    【解决方案2】:

    您的代码难以阅读。如果您提高可读性,它将使您和其他人更容易理解正在发生的事情。

    第一步是把它分成三部分:

    • 从用户那里获取输入
    • 计算结果
    • 向用户显示结果

    然后我会考虑重命名变量。我不知道blankmiscvals 是什么以及为什么你经常使用reverse()


    在 pyhton 中有内置 min() 函数 Built-in Functions

    我会将它与来自collectionsdefaultdict 结合起来

    并像这样使用它们:

    from collections import defaultdict
    
    scores_names = defaultdict(list)  # {3:["Johny", "Sanny"], 4:[Ben]}
    # Getting input from a user
    n = int(input("n:"))
    for i in range(0, n):
        scores_names[float(input("score:"))].append(input("name:"))
    # Calculating the result
    min_score = min(scores_names.keys())
    result = scores_names[min_score]
    # Displaying result to a user
    print(result)
    

    控制台:

    n:3
    score:3
    name:Johny
    score:3
    name:Sanny
    score:4
    name:Ben
    ['Johny', 'Sanny']
    

    如果您希望您的代码看起来不错并遵循 PEP8,请考虑使用 Black

    如果您想了解有关如何重构的更多信息,请考虑阅读此book

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-05-18
      • 1970-01-01
      • 1970-01-01
      • 2020-03-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-02
      相关资源
      最近更新 更多