Python 如何减少elif语句

Python 如何减少elif语句,python,Python,我的脚本运行C程序digitemp。输出以包含传感器ID和温度的行为单位。我需要将传感器ID与一个特定的名称匹配,从而匹配所有的ELIF。我在本例中使用了first、second和third作为计算ID的名称。有没有办法减少所有的elif语句,因为还有更多的语句需要添加 import os # get digitemps output cmd = "/bin/digitemp_ -c /bin/digitemp.conf -q -a" def digitemps(): for out

我的脚本运行C程序digitemp。输出以包含传感器ID和温度的行为单位。我需要将传感器ID与一个特定的名称匹配,从而匹配所有的ELIF。我在本例中使用了first、second和third作为计算ID的名称。有没有办法减少所有的elif语句,因为还有更多的语句需要添加

import os

# get digitemps output
cmd = "/bin/digitemp_ -c /bin/digitemp.conf -q -a"

def digitemps():
    for outline in os.popen(cmd).readlines():
        outline = outline[:-1].split()
        if outline[0] == '28F4F525030000D1':
            temp_ = outline[1]
            print 'first ' + temp_
        elif outline[0] == '28622A260300006B':
            temp_ = outline[1]
            print 'second ' + temp_
        elif outline[0] == '28622A2603000080':
            temp_ = outline[1]
            print 'third ' + temp_

digitemps()

使用字典将传感器ID映射到人类可读的名称:

id_to_name = {"28F4F525030000D1": "first",
              "28622A260300006B": "second",
              "28622A2603000080", "third"}
print id_to_name.get(outline[0], outline[0]) + outline[1]

这种方法的优点是,如果没有为ID分配人类可读的名称,那么
get
方法将返回ID而不做任何更改。

不幸的是,Python无法这样做。如果你使用C++,你可以使用开关语句,但是Python没有这样的均衡。对不起

循环中的大多数逻辑可以使用生成器表达式编写,这是等效的代码,并考虑了@DSM在注释中的建议:

d = {'28F4F525030000D1':'first ',
     '28622A260300006B':'second ',
     '28622A2603000080':'third '}

def digitemps():
  for s in (d.get(x[0],x[0]) + x[1] for x in (e.split() for e in os.popen(cmd))):
    print s

有点离题:为什么你更喜欢dict(元组)而不是literal?反斜杠绝对没用。除此之外(我想这就是贝雷尔的意思)
{“28f4f52530000d1”:“first”,…}
是更常见、更易读的语法。这是无效的语法
dict
将接受一个元组的iterable,但在编写时它将引发一个
TypeError:dict最多需要1个参数,得到3个
异常。@delnan:是的,这可能是一个选项,当然。我的错。1:你不需要
.readlines()
在这里;没有它,代码也能正常工作。旁白#2:你不需要
[:-1]
.split()
将自动去除尾随的空白,而且
[:-1]
通常有点危险,因为有时文件在最后一行缺少CR。[例如,在Python中,人们有时会执行类似于
“\n”的操作。join(一些字符串)
,它不会添加尾随
\n
]@l4mpi:Ummm…链接显示提案被拒绝了。。。???如果真的有,我会很高兴的。一个切换语句!l4mpi并没有说您对缺少switch语句的看法是错误的,但您的结论是错误的——还有其他可能的改进(其中一些改进甚至比
switch
更有效)。@delnan:哪些改进?我一直在寻找wlid替代方案,我很好奇你知道哪些替代方案。正如l4mpi所说,看看其他答案。