为了账号安全,请及时绑定邮箱和手机立即绑定

从字典中获取最大值和相应的值

从字典中获取最大值和相应的值

慕后森 2022-09-13 15:22:41
我有python脚本,它使用谷歌STT引擎,然后它循环通过字典来检查最大的匹配(比率)在哪里使用差异序列马切尔更新(更好地解释脚本需要做什么):变量izgovoreno包含字符串(来自谷歌STT引擎,实际上是麦克风) - 假设它的值是“灯”有嵌套字典,其中每个热词(如“灯亮”,“百叶窗关闭”等)都包含相应的命令。有“热词”,有“科曼达”。在此示例中,热词值是“灯亮起”,相应的komanda是“执行一些代码来打开灯”只有当变量izgovoreno和热词之间存在一定的百分比(至少50%或0.5)匹配时,才会执行komanda。因此,有一个for循环,它通过字典并使用difflib。序列矩阵将变量izgovoreno与字典中的所有热词进行比较,然后将结果(百分比)写入每个相应热词的键“razlika_izgovoreno_hotword”。现在我们有包含此数据的字典(示例):hotword:"lights on"komanda:"execute some code to turn on the lights"razlika_izgovoreno_hotword:"0.90"hotword:"blinds shut"komanda:"execute some code shut blinds"razlika_izgovoreno_hotword:"0.10"etc.在下一步中,我使用for loop(这是在代码中分离的循环,这给我带来了麻烦)从字典中获取razlika_izgovoreno_hotword的最大值,并从键热词和komanda中获取相应的值。但是,说实话,这个循环是香肠,我真的不明白它是如何工作的(我是python的新手),但我能够获得razlika_izgovoreno_hotword和komanda值的最大值。我只能获得热词值,这不是脚本工作的必需值,但是将其用于调试是很好的。在这个例子中,预期结果(与变量izgovoreno相比,最佳匹配)当然是热词“亮起”,匹配比为0.9,然后执行变量komanda =“执行一些代码来打开灯”。完整的工作代码:#!/usr/bin/env python3.6# -*- coding: UTF-8 -*-# NOTE: this example requires PyAudio because it uses the Microphone classimport snowboydecoderimport sysimport signalimport subprocessimport speech_recognition as srimport urllibimport difflibinterrupted = Falsedef signal_handler(signal, frame):    global interrupted    interrupted = Truedef interrupt_callback():    global interrupted    return interruptedif len(sys.argv) == 1:    print("Error: need to specify model name")    print("Usage: python demo.py your.model")    sys.exit(-1)model = sys.argv[1]# capture SIGINT signal, e.g., Ctrl+Csignal.signal(signal.SIGINT, signal_handler)detector = snowboydecoder.HotwordDetector(model, sensitivity=0.5)
查看完整描述

1 回答

?
动漫人物

TA贡献1815条经验 获得超10个赞

我首先将一个冗长的“for”语句的混乱重新格式化为如下所示的内容:


for inner_d in glasovne_naredbe.values():

    print(inner_d)

    ...

这将使您的代码更易于您(和其他人)遵循,并将导致答案。


还要确保 max() 正在做你认为它正在做的事情。


这不是一个明确的问题,所以我想这可能会有所帮助。这是一个完全运行的Python解决方案,显示了我认为您的问题所问的问题的解决方案:


glasovne_naredbe = {'glasovno1': 

    {'komanda': "urllib.urlopen('http://127.0.0.1:8080/json.htm?    type=command&param=switchlight&idx=2&switchcmd=On')", 

    'hotword': 'svijetlo', 

    'razlika_izgovoreno_hotword': 0.16666666666666666}, 

'glasovno2':

     {'komanda': "subprocess.Popen(['amixer', 'set', 'Master', '100%'])", 

    'hotword': 'najglasnije',

     'razlika_izgovoreno_hotword': 0.13333333333333333},

 'glasovno3': 

    {'komanda': "subprocess.Popen(['amixer', 'set', 'Master', '10%'])",

     'hotword': 'najti\xc5\xa1e',

     'razlika_izgovoreno_hotword': 0.36363636363636365},

 'glasovno4': 

    {'komanda': "subprocess.Popen(['amixer', 'set', 'Master', '50%'])", 

    'hotword': 'srednje glasno',

     'razlika_izgovoreno_hotword': 0.2222222222222222},

 'glasovno5':

     {'komanda': "subprocess.Popen(['amixer', 'set', 'Master', '10%-'])",

     'hotword': 'smanji',

     'razlika_izgovoreno_hotword': 0.2},

 'glasovno6': 

    {'komanda': "subprocess.Popen(['amixer', 'set', 'Master', '10%+'])", 

    'hotword': 'poja\xc4\x8daj',

     'razlika_izgovoreno_hotword': 0.0}}


max_key,value = next(iter(glasovne_naredbe.items()))

max_value = value['razlika_izgovoreno_hotword']

for key, value in glasovne_naredbe.items():

    print(key)

    print(value)

    new_value = value['razlika_izgovoreno_hotword']

    if new_value > max_value:

        print("new max")

        print(key)

        max_value = new_value

        max_key = key

print("max key %s" % max_key)

print("corresponding komanda %s" % glasovne_naredbe[max_key]['komanda'])

print("corresponding hotword %s" % glasovne_naredbe[max_key]['hotword'])

print("corresponding r_i_h %s" % glasovne_naredbe[max_key]['razlika_izgovoreno_hotword'])



查看完整回答
反对 回复 2022-09-13
  • 1 回答
  • 0 关注
  • 103 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号