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

Python 从字典中获取最大值和相应的值,python,dictionary,max,Python,Dictionary,Max,我有一个python脚本,它使用googlestt引擎,然后通过difflib-SequenceMatcher在字典中循环检查最大匹配(比率)的位置 更新(更好地解释脚本需要执行的操作): 变量izgovoreno包含字符串(来自谷歌STT引擎,实际上是麦克风)——假设它的值是“lights” 有一个嵌套字典,其中每个热词(如“灯亮”、“百叶窗关”等)都包含相应的编码命令。有“热词”和“科曼达”。在这个例子中,hotword的值是“lights on”,相应的komanda是“executeso

我有一个python脚本,它使用googlestt引擎,然后通过difflib-SequenceMatcher在字典中循环检查最大匹配(比率)的位置

更新(更好地解释脚本需要执行的操作):

  • 变量izgovoreno包含字符串(来自谷歌STT引擎,实际上是麦克风)——假设它的值是“lights”
  • 有一个嵌套字典,其中每个热词(如“灯亮”、“百叶窗关”等)都包含相应的编码命令。有“热词”和“科曼达”。在这个例子中,hotword的值是“lights on”,相应的komanda是“executesome code to open the lights”
  • 只有在变量izgovoreno和hotword之间存在某种百分比(至少50%或0.5十进制)匹配时,才会执行komanda。 所以,有一个for循环通过difflib.SequenceMatcher通过difflib.SequenceMatcher将变量izgovoreno与dictionary中的所有hotwords进行比较,然后将结果(百分比)写入每个对应hotword的关键字“razlika_izgovoreno_hotword”
  • 现在我们有了包含此数据的字典(示例):
  • 在下一步中,我将使用for循环(这是代码中分离的循环,这给我带来了麻烦)从字典中获取razlika_izgovoreno_hotword的最大值,并从关键字hotword和komanda中获取相应的值。但是,老实说,这个循环是香肠,我真的不明白它是如何工作的(我是python新手),但我能够为razlika_izgovoreno_hotword和komanda value获得最大值。 我只是无法获得hotword值,这不是脚本工作所必需的,但拥有它进行调试很好
  • 本例中的预期结果(与变量izgovoreno相比最佳匹配)当然是匹配率为0.9的热词“lights on”,然后执行变量komanda=“execute some code to open the lights”
  • 完整工作代码:

    #!/usr/bin/env python3.6
    # -*- coding: UTF-8 -*-
    # NOTE: this example requires PyAudio because it uses the Microphone class
    
    import snowboydecoder
    import sys
    import signal
    import subprocess
    import speech_recognition as sr
    import urllib
    import difflib
    
    interrupted = False
    
    
    def signal_handler(signal, frame):
        global interrupted
        interrupted = True
    
    
    def interrupt_callback():
        global interrupted
        return interrupted
    
    if 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+C
    signal.signal(signal.SIGINT, signal_handler)
    
    detector = snowboydecoder.HotwordDetector(model, sensitivity=0.5)
    print('Snowboy listening... Press Ctrl+C to exit')
    
    # main loop
    def detektiran():
     snowboydecoder.play_audio_file()
     r = sr.Recognizer()
     with sr.Microphone() as source:
        print("Say something!")
        audio = r.listen(source,phrase_time_limit=5)
     # recognize speech using Google Speech Recognition
        try:
        # for testing purposes, we're just using the default API key
        # to use another API key, use `r.recognize_google(audio, key="GOOGLE_SPEECH_RECOGNITION_API_KEY")`
        # instead of `r.recognize_google(audio)`
             print("Izgovoreno: " + r.recognize_google(audio, language="hr-HR"))
         izgovoreno = r.recognize_google(audio, language="hr-HR")
    
            ##############KOMANDE - ubacivanje novih i promjena postojecih#################################################
         glasovne_naredbe = {
              ###svijetlo 1 prostorija
             'glasovno1' : {
              "hotword": "svijetlo",
              "komanda": "urllib.urlopen('http://127.0.0.1:8080/json.htm?type=command&param=switchlight&idx=2&switchcmd=On')"
             },
              ###zvuk najglasnije
             'glasovno2' : {
              "hotword": "najglasnije",
              "komanda": "subprocess.Popen(['amixer', 'set', 'Master', '100%'])"
             },
              ###zvuk najtiše
             'glasovno3' : {
              "hotword": "najtiše",
              "komanda": "subprocess.Popen(['amixer', 'set', 'Master', '10%'])"
             },
              ###zvuk srednje glasno
             'glasovno4' : {
              "hotword": "srednje glasno",
              "komanda": "subprocess.Popen(['amixer', 'set', 'Master', '50%'])"
             },
              ###zvuk smanji
             'glasovno5' : {
              "hotword": "smanji",
              "komanda": "subprocess.Popen(['amixer', 'set', 'Master', '10%-'])"
             },
              ###zvuk pojačaj
             'glasovno6' : {
              "hotword": "pojačaj",
              "komanda": "subprocess.Popen(['amixer', 'set', 'Master', '10%+'])"
             }
          }
    
    
    
              ###############KOMANDE KRAJ##########################################################################
         i = 0
         for a, b in glasovne_naredbe.items():
            #print(a, b)
            i += 1
            glasovno = ("glasovno" + str(i)) 
            hotword = (glasovne_naredbe[glasovno]['hotword'])
                hotword_decoded = hotword.decode('utf-8')
                razlika_izgovoreno_hotword = difflib.SequenceMatcher(None, izgovoreno, hotword_decoded).ratio() #svaka razlika iznad 0.50 aktivira komandu  
                #print ("Omjer(%s) Izgovoreno (%s) Hotword (%s)" % (razlika_izgovoreno_hotword, izgovoreno, hotword_decoded))
            #ubacivanje (privremenog) rezultata razlika_izgovoreno_hotword u dictionary
            glasovne_naredbe[glasovno]['razlika_izgovoreno_hotword'] = razlika_izgovoreno_hotword
         #izvlacenje maksimalnog razlika_izgovoreno_hotword iz dictionarya  
         razlika_izgovoreno_key, razlika_izgovoreno_value, komanda_value, komanda_key = \
         max(((raz_k,raz_v,k_k,k_v)  for inner_d in glasovne_naredbe.values() for raz_k,raz_v in inner_d.items() for k_v,k_k in inner_d.items()))
         print("Vrijednost razlika_izgovoreno postotak: %s" % (razlika_izgovoreno_value))
         print("Komanda: %s" % (komanda_value)) 
         if razlika_izgovoreno_value >= 0.50: #ako je ratio u postotku veci od 0.50, pokreni komandu
            exec(komanda_value)
            #dong zvuk da je uspjesno izvedeno
         else:
            print ("Izgovoreno se ne podudara minimalno 50% sa nijednim hotwordom, molim ponovi!")
    
        except sr.UnknownValueError:
            print("Google Speech Recognition could not understand audio")
        except sr.RequestError as e:
            print("Could not request results from Google Speech Recognition service; {0}".format(e))
    
    detector.start(detected_callback=detektiran,
                   interrupt_check=interrupt_callback,
                   sleep_time=0.03)
    
    detector.terminate()
    
    我对代码的这一部分有问题,我可以得到“razlika_izgovoreno_值”的最大值,我可以得到相应的“komanda_值”,但我无法得到“hotword_值”的对应值

    有什么建议吗?我已经尝试了for循环中的每一种组合,但我就是无法得到hotword的值

    编辑: glasovne_naredbe的输出(用于比较的测试词为“测试”)


    首先,我要将冗长的“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'])
    
    参考资料:


    建议:发布可直接运行的代码。2.明确说明你想做什么。打破它的内心世界。。。分为一系列步骤。添加解释每个步骤的注释。打印中间输出以查看出了什么问题。你认为max()在做什么?您认为在每个步骤中传递给max()的值是什么?无法完全理解语言。保加利亚人?塞尔维亚人?我很好奇,如果是这样的话OK@poleguy谢谢你的建议,我会尽量把这件事简单化。上校:这是克罗地亚语(99%与塞尔维亚语相同),请包括打印输出(glasovne_naredbe)。就在中断的for循环之前。@poleguy好的,添加了。我添加了关于代码需要做什么的更好的解释。我已经测试过这段代码,但它总是返回“glasovno1”值,似乎它看不出哪个hotword键上的值最大“razlika_izgovoreno_热词”。我不确定你是否不明白我需要什么或者有什么bug。无论如何谢谢你!我想现在,我的示例答案是您的问题应该是什么样子:完全可执行的代码,在顶部完全定义数据。如果不是现在,也许我仍然没有理解你的意图,或者我对你的数据的猜测是错误的。
    Izgovoreno: test
    {'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}
    
    for inner_d in glasovne_naredbe.values():
        print(inner_d)
        ...
    
    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'])