【问题标题】:defining multiple variables with a condition in python在python中用条件定义多个变量
【发布时间】:2022-08-20 00:33:33
【问题描述】:

我正在编写代码,其中一部分我需要访问 DataFrame 中的数据。主要问题是数据框中的列可能会根据访问的文件而改变。所以我认为我可以为访问它的键定义 aux var。我现在的主要问题是代码似乎可以工作,但解决方案看起来很丑陋。


if isAirData:
        LOGlat  = \'latitude\'
        LOGlon  = \'longitude\'
        LOGalt  = \'height_above_takeoff(feet)\'
        LOGtime = \'datetime(utc)\'
        LOGhead = \'compass_heading(degrees)\'
        LOGpitch= \'gimbal_pitch(degrees)\'#pitch(degrees)\'
        LOGroll = \'roll(degrees)\'
        LOGvid  = \'isVideo\'
else:
        LOGlat  = \'OSD.latitude\'
        LOGlon  = \'OSD.longitude\'
        LOGalt  = \'OSD.height[ft]\'
        LOGtime = \'CUSTOM.updateTime[local]\'
        LOGhead = \'OSD.yaw\'
        LOGpitch= \'OSD.pitch\'
        LOGroll = \'OSD.roll\'
        LOGvid  = \'CAMERA.isVideo\'
        

这些是我感兴趣的钥匙。在不同的文件中列号和名称发生变化。所以我想知道哪个是最好的方法?

  • IMO 你的代码没那么难看。如果您想使用其他东西,那么您可以随时使用ternary operator
  • 我没有看到您的代码有任何丑陋之处,但是,根据这些变量的使用方式,您可以通过使用字典或元组列表来改进维护工作,但正如我所说,这取决于该列表的可爱程度要更改的变量,或者您是否可以通过遍历它们来优化代码。

标签: python


【解决方案1】:

首先,我将为您可能访问的每种文件类型创建一个 json 文件,如下所示:

{
   'LOGlat': 'latitude',
   'LOGlon': 'longitude',
   ...
}

然后我将访问相关文件,将 DataFrame 的键保存在字典中。 我的代码看起来像这样:

import json

def read_file(path):
    file = open(path)
    data = file.read()
    file.close()
    return data

isAirData = True
keys = {}

if isAirData:
    data = read_file('isAir.json')
    keys = json.loads(data)
else:
    data = read_file('isNotAir.json')
    keys = json.loads(data)

现在,访问列名所需要做的就是:

DataFrame[keys['key_name']]

我知道这个解决方案会减慢你的代码,但如果你想要的只是漂亮的代码,这很好用

希望你觉得这个有用

【讨论】:

    【解决方案2】:

    我会创建一个类容器。我建议从StrEnum 继承,尽管它可能是多余的:

    from strenum import StrEnum
    
    class AirData(StrEnum):
            LOGlat  = 'latitude'
            LOGlon  = 'longitude'
            LOGalt  = 'height_above_takeoff(feet)'
            LOGtime = 'datetime(utc)'
            LOGhead = 'compass_heading(degrees)'
            LOGpitch= 'gimbal_pitch(degrees)'#pitch(degrees)'
            LOGroll = 'roll(degrees)'
            LOGvid  = 'isVideo'
    
    class NotAirData(StrEnum):
            LOGlat  = 'OSD.latitude'
            LOGlon  = 'OSD.longitude'
            LOGalt  = 'OSD.height[ft]'
            LOGtime = 'CUSTOM.updateTime[local]'
            LOGhead = 'OSD.yaw'
            LOGpitch= 'OSD.pitch'
            LOGroll = 'OSD.roll'
            LOGvid  = 'CAMERA.isVideo'
    

    因此,您可以使用单个定义作为

    mylabels = AirData if isAirData else NotAirData
    do_something(mylabels.LOGlat)
    

    优点:

    • 项目在需要时被视为字符串类型
    • 您不需要外部资源文件:您只需导入包含两个已定义类的模块即可。

    【讨论】:

    • 我认为这是一个很好的解决方案,这里有一个问题,为什么要让类继承自 StrEnum ?这有什么好处?
    • 只是来自枚举器的优势。但我同意你的看法,这可能是多余的
    • 对不起我的无知,但有哪些优点?的不介意你解释,如果不是我会去阅读。
    • 通过元素轻松迭代,仅针对这种情况提及一个。检查此答案以获取更多广告stackoverflow.com/a/37601645/5321862
    • 例如:headers=[header for header in AirData] 立即为您的 Qt 表提供标题列表
    猜你喜欢
    • 1970-01-01
    • 2013-10-06
    • 1970-01-01
    • 2011-01-26
    • 2015-12-05
    • 2023-01-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多