从浮点数创建一个满星和半星的命令行星级评分? Python 3

时间:2015-08-24 20:11:14

标签: python logic

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

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

详情如下:

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

到目前为止我的代码:

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,则追加半星&#34; - &#34;否则如果它接近40,则追加一个完整的星&#34; +&#34; < / LI>

我一直试图在脑子里工作几个小时(我猜我甚至不能通过自己的面试),而且我还没有制定任何成功的方法。

我怎么能做到这一点?

4 个答案:

答案 0 :(得分: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范围内)

答案 1 :(得分:1)

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')
'+++++'

答案 2 :(得分:0)

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

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

rating的值是浮点数。

编辑:更改了数字。

答案 3 :(得分:-1)

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('-')