字典变量的近似和修改

时间:2018-07-17 06:04:41

标签: python approximation

我有一个问题 我有一本叫做(plane)的字典,可以在其中调用诸如“名称”或“速度”之类的变量。

这些值例如给我这样的输出:

print(plane.get('name'))
print(plane.get('altitude'))

输出:

'name'= FLRDD8EFC
'speed'= 136.054323

我的问题是,我怎样才能如下估算值?

'name'= DD8EFC (Always deleting the first three lines)
'speed'= 136.  (Approximate whole)

非常感谢您的帮助! G

3 个答案:

答案 0 :(得分:3)

  

我的问题是,我怎样才能如下估算值?

您必须显式地编写代码。


  

'name'= DD8EFC(始终删除前三行)

获取字符串,然后切成薄片:

name = plane.get('name')[3:]
print(f"'name' = {name}'")

但是,您使用的是get而不是[]的事实意味着您期望处理name中不存在plane的可能性

如果这是不可能的,您应该只使用[]

name = plane['name'][3:]

如果,则需要提供一个可以切片的默认值:

name = plane.get('name', '')[3:]

  

“速度” =136。(近似整数)

您似乎想四舍五入为小数位数,但将其保留为float吗?拨打带有round位数字的0。同样,您不需要get,或者您需要其他默认值:

speed = round(plane['speed'], 0)

…或:

speed = round(plane.get('speed', 0.0), 0)

关于打印它:Python不喜欢在.之后打印float而不打印任何小数值。您可以使用format字段,但是手动将.放入可能会更简单:

print(f"'speed': {speed}.")

答案 1 :(得分:1)

>>> plane.get('name')[3:]
'DD8EFC'
>>> round(plane.get('speed'))
136

答案 2 :(得分:0)

您可能可以继承collections.UserDict的子类(或@abamert建议的dict),并使用特殊方法__getitem__编写某种开关/过滤器/格式化器:

类似的东西,也许:

from collections import UserDict


class MyDict(UserDict):

    def __getitem__(self, key):
        if key == 'name':
            return self.data[key][3:]
        if key == 'speed':
            return round(self.data[key], 3)
        return self.data[key]


if __name__ == '__main__':

    mydata = MyDict({'name': 'ABCDEF', 'speed': 12.123456})
    print(mydata['name'], mydata['speed'])

输出:

DEF 12.123

或子类化dict

class MyDict(dict):

    def __getitem__(self, key):
        if key == 'name':
            return self.get(key)[3:]
        if key == 'speed':
            return round(self.get(key), 3)
        return self[key]

免责声明: 这比任何东西都更能证明概念;我不推荐这种方法。该“开关”很丑陋,一旦约束列表增加一点,它可能会失控。