【问题标题】:Create a command line star rating with full and half stars from a float? Python 3从浮点数创建一个带有满星和半星的命令行星级?蟒蛇 3
【发布时间】:2015-08-24 20:11:14
【问题描述】:

所以我正在开发一个获取酒店详细信息的命令行应用程序,其中一个详细信息是它们的“星级”。我可以列出我得到它的字符串,但这并不好玩,我希望应用程序真的看起来不错。所以我想自己创建星级的外观。

我不知道,这可能需要比我想象的更多的数学知识(它甚至可以成为一个很好的面试问题)。

详情如下:

  • 我传入的数据如下所示:3.7 stars
  • 我想得到一个最接近的估计,在这个 3.5 就足够了。
  • 我将它作为字符串返回,看起来应该像“++-”,其中“+”表示满星,“-”表示半星

到目前为止我的代码:

def format_hotel_rating(self, rating):
    rating_as_num = float(rating[:3])  # rating => "3.7 stars"

    for i in range(0, new_rating * 10):
        if i % 10 == 0:
            new_rating += "+"

        # still missing half star logic

到目前为止,我的逻辑是这样的:

  • 取小数并乘以 10(这样可以更容易地迭代)
  • 每 10 次迭代,添加一个满星
  • 当不能有另一个 10 的倍数时,在最后一个 10 的倍数和最后一次迭代之间计算每个迭代
  • 例如 10(满星)、20(满星)、30(满星)、31、32、33、34、35、36、37
  • 然后,确定37 是否更接近3540。如果接近 35,则附加半星“-”,否则如果接近 40,则附加满星“+”

几个小时以来,我一直试图在脑海中解决这个问题(我想我什至无法通过自己的面试),但我还没有开发出任何成功的方法。

我怎样才能做到这一点?

【问题讨论】:

    标签: python logic


    【解决方案1】:

    为什么不通过纯粹在浮点域中工作来替换最后一个 for 循环?

    pure_rating = int(rating_as_num)
    decimal_part = rating_as_num - pure_rating
    final_score = "+" * pure_rating
    if decimal_part >= 0.75:
       final_score += "+"
    elif decimal_part >= 0.25:
       final_score += "-"
    

    第一行查找评分的整数部分 (3.7 -> 3)。

    第二行通过减去两个来找到小数部分。 (3.7 - 3 -> 0.7)

    最后,您首先创建pure_rating 数量的"+" 字符。然后根据小数部分添加"+""-"(无论是在0.5-0.75范围内还是0.75-0.99范围内)

    【讨论】:

    • 好,明确,但是当 int 做同样的事情时不需要使用 math.floor (除非数学已经被导入那么它没有区别),那么你不需要在做的时候将它转换为 int '+' * pure_rating
    • 0.25-0.5 范围呢?例如,3.4 最接近 +++-
    • 哦,您需要在0.25-0.5 范围内加半星还是不加星?将比较运算符中的 0.5 更改为 0.25 即可解决问题
    • 好的,通过一些调整,我可以将此标记为正确答案。我运行了你的代码,它确实做到了这一点。所有需要更改的是:if decimal_path >= 0.75: final_score += "+"elif decimal_path >= 0.25: final_score += "-"。当它们被附加时,这些标志必须是相反的。很好的答案!这也消除了循环的需要。
    【解决方案2】:
    def extract_rating_from_string(rating_string):
        """
        eg. rating_string = '3.7 stars'
        """
        return float(rating_string.split()[0])
    
    def round_rating_to_half(rating):
        """
        Round to nearest half
        """
        return round(rating * 2) / 2
    
    def get_rating_stars(rating_string):
        """
        Main function to return stars from string
        """
        full_star = '+'
        half_star = '-'
        rating_float = extract_rating_from_string(rating_string)
        rounded_rating = round_rating_to_half(rating_float)
    
        if divmod(rounded_rating, 1)[1] == 0.5:
            return int(rounded_rating)*full_star + half_star
        else:
            return int(rounded_rating)*full_star
    

    输出:

    >>> get_rating_stars('3.7 stars')
    '+++-'
    >>> get_rating_stars('3.1 stars')
    '+++'
    >>> get_rating_stars('4.9 stars')
    '+++++'
    

    【讨论】:

      【解决方案3】:

      这是一个简单的两个班轮:

      a, b = divmod(rating, 1.0)
      stars = int(a) * '+' + ('-' if b >= 0.5 else '')
      

      rating 是你的浮点值。

      编辑:更改了数字。

      【讨论】:

      • 我编辑了这些数字。另一个为rating * 2 吐槽的地方。
      • 这不考虑四舍五入到最接近的0.5。例如,3.4 的评级应该得到+++- 作为输出,但这段代码给出了+++
      【解决方案4】:
      rating = 3.5 #or whatever the rating is
      for i in range(int(3.5)) #int truncates decimal... get "whole" stars
          print('+', end='')
      decimal = rating % 1 #gets how much "partial star" left over
      if decimal >= .7: #close enough to be full star
          print('+')
      else:
          print('-')
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-13
        • 1970-01-01
        • 2021-11-25
        • 2019-05-31
        • 2019-04-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多