对单个函数应用多个引用的最佳pythonic方法

2024-09-28 01:23:22 发布

您现在位置:Python中文网/ 问答频道 /正文

我正在读一个包含数千条记录的文本文件(每行一条)。每个字符以5个字符开头,首先是字母,然后是4个数字,例如H0100

可用起始标签的列表被定义为不随机的,尽管最后一个数值可以是1-9之间的任何值(有时最后两个可以是1-9)

所以一类记录可以是以下的H0100,H0101…..H0109

有些情况下,最后一个到的数字的范围是100个组合

我想创建一个函数来处理每条记录,这样如果标签中的前3个或4个字符被标识,则调用相同的函数。原因是这些记录在格式上基本相同,即使标签中的最后一个或两个值发生更改,也可以进行相同的处理

以下是我目前如何处理H0100,H0101…..H0109的案例

    for line in (file):
            #turn the first 5 characters into an object
            obj = eval (line[0:5]) 
            obj (line)

    def H0100(line)
          .....process line

    #Just point all the alternative to the one function
    H0101 = H0102 = H0103 = H0104 = H0105 = H0106 = H0107 = H0108 = H0109 = H0100

这个作品,但它看起来不是很优雅,我相信它不是Python!有人对我如何使这更简单/更优雅有什么建议吗?我有40-50个标签与一个字符的变化和少数两个字符的变化,因此必须指出100个替代品,以一个功能

非常感谢


Tags: the函数obj列表字母记录line数字
2条回答

我个人倾向于使用由相关前缀键入的函数字典

def H0100(line)
      .....process line

funcs = { 'H010' : H0100,
          'H020' : H0200,
          ... etc...
        }

那么

for line in file:
    f = funcs[ line[:4] ]
    f(line) 

这就像前缀长度是固定的一样工作。可变长度前缀需要对这种方法稍加修改。您可以通过查看行并确定它是三个字母的前缀标识符还是四个字母的前缀标识符来实现相同的策略,然后针对这种情况使用适当的查找表。如果没有更多细节,很难提出具体的实施方案

您可以使用python的内置exec函数

for i in range(101,110):
    print("H0%d = H0100" % i)   # Just so you see exactly what gets executed
    exec( "H0%d = H0100" % i)   # Perform each assignment

但是,我认为您不希望创建一组具有唯一名称的变量(这当然不是pythonic的,对于任何语言来说,这通常都是不好的做法)。最好使用数据结构,如ListDictionary

相关问题 更多 >

    热门问题