我该如何修复此程序,使其不会 return 'unknown' 用于负输入 (boiling_point)

how can I fix this program so it won't return 'unknown' for negative input (boiling_point)

这是我要解决的问题:

*python 编写一个函数,给定从 material 到沸点的映射以及沸点温度,将 return :

函数签名应如下所示:boiling_material(boiling_map, boiling_point)

一个例子boiling_map:给定输入: '丁烷':_0.5, 'copper' : 1187, 'Gold' : 2660, 'Mercury' : 357, 'Methane':_161.7, 'Nonane': 150.8, 'Silver' : 2197, 'water': 100}*

具有上述输入的程序示例 运行:

输入沸点 > 359 最近的 material : Mercury

输入沸点 > 2000 最近的material:未知

我试图解决它,当输入为正数时它 return 输出正确,但当输入为负数时它仅 return 输出 'unknown'。 示例: 输入沸点 > -0.475 预期最接近 material :丁烷 实际输出:未知

这是我当前的代码。

    boiling_map=dict()
boiling_map['Butane']=-0.5
boiling_map['Copper']=1187
boiling_map['Gold']=2660
boiling_map['Mercury']=357
boiling_map['Methane']=-161.7
boiling_map['Nonane']=150.8
boiling_map['water']=100

def boiling_material(boiling_map,boiling_point):
    closest='unknown'
    for material in boiling_map:
        if abs(boiling_map[material]) >=abs(boiling_point-(boiling_point*5//100)) and abs(boiling_map[material]-boiling_point)<=abs(boiling_point+(boiling_point*5//100)) :
            closest=material
    return closest



print(boiling_material(boiling_map,359))
print(boiling_material(boiling_map,-0.475))
print(boiling_material(boiling_map,0))

你可以这样做。下面是使用 Python 3.10.4,3.10 以下的任何东西都不支持使用 match 关键字。请注意,对于某些测试温度,您会在某些温标上获得已知结果,但在其他温标上则不然。请注意,此处的结果要么是“未知”,要么是候选列表。 添加了 material 和一些测试温度以使事情变得有趣。

from enum import Enum
import sys;

class TemperatureScale(Enum):
    CELCIUS = 1
    KELVIN = 2
    FAHRENHEIT = 3

# boiling points are in kelvin
materials = { "Butane": 272.65
            , "Copper": 1460.15
            , "Gold": 2933.15
            , "Mercury": 630.15
            , "Methane": 111.45
            , "Nonane": 423.95
            , "Water": 373.15
            , "Propyl Alcohol": 370.65
            }

def kelvin_to_scale(temp, scale):
    match scale:
        case TemperatureScale.KELVIN:
            return temp
        case TemperatureScale.CELCIUS:
            return temp - 273.15
        case TemperatureScale.FAHRENHEIT:
            return 1.8 * (temp - 273.15) + 32
        case _:
            raise Exception('unknown scale')

def scale_to_kelvin(temp, scale):
    match scale:
        case TemperatureScale.KELVIN:
            return temp
        case TemperatureScale.CELCIUS:
            return temp + 273.15
        case TemperatureScale.FAHRENHEIT:
            return (temp*5//9)+459.67
        case _:
            raise Exception('unknown scale')

def test_material(boiling_point, scale = TemperatureScale.KELVIN):
    print(f'Test temperature: {boiling_point} {scale}')
    candidates = []
    for material in materials:
        bp = kelvin_to_scale(materials[material], scale)
        margin = abs(boiling_point)*5//100
        print(f'Testing {material} using {bp} +/- {margin}:\t{bp - margin} <= {boiling_point} < {bp + margin}')
        if (bp - margin <= boiling_point) and (bp + margin > boiling_point):
            candidates += [ material ]
    return candidates

# test values are in celcius
test_values = [ 2801, 359, -0.475, 0, 95 ]

for test_value in test_values:
    kelvin_value = scale_to_kelvin(test_value, TemperatureScale.CELCIUS)
    for scale in [ TemperatureScale.CELCIUS, TemperatureScale.KELVIN, TemperatureScale.FAHRENHEIT ]:
        print(test_material(kelvin_to_scale(kelvin_value, scale), scale) or 'unknown')