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