[英]Is there a pythonic way to use a Counter as Key when updating a dictionary with new elements?
我有一本字典,隨着時間的推移需要用新元素更新,我希望鍵是一個計數器,每添加一個新元素就增加 1。
我的解決方案如下所示:
dic = {}
counter = 0
def add_to_dic(dic, element):
global counter
if element not in dic.values():
counter += 1
dic[counter] = element
element = "something_same"
add_to_dic(dic, element)
element = "something_same"
add_to_dic(dic, element)
element = "something_same"
add_to_dic(dic, element)
element = "something_different"
add_to_dic(dic, element)
print(dic)
# $ {1: 'something_same', 2: 'something_different'}
有沒有更好的方法來增加密鑰?
# - - - - - - - - - - - - - - - 更新 - - - - - - - - - ------------#
在我的場景中,我有多個連接到 Flask 服務器的 rpi/客戶端,它們通過 POST 請求發送視頻幀。
response = requests.post(server_url, data = client_ip + frame, headers=headers, timeout=1/20)
在服務器中,我想根據它們的 IP 地址為每個客戶端動態分配一個密鑰。 因此,如果客戶端連接並開始發送幀,則會為每個單獨的客戶端創建一個新的字典鍵。 我將 ip 作為附加到幀開頭的字符串發送。 IP 范圍“192.168.1.100”及以上,因此字符串的 len 為 13。 frame_to_stream是我用來保存客戶端幀的字典, client_dic是我想要的 counter_key--ip_client 組合的字典。
#...
frame_to_stream = {}
client_dic = {}
@flask.route('/api/test', methods=['POST'])
def test():
r = request
client_ip = r.data[:13]
if client_ip not in client_dic.values():
counter += 1
client_dic[counter] = client_ip
frame_to_stream[counter] = r.data[13:] #Frame of that client
#...
之后,我只需使用 Key 輸入 URL,這樣我就可以決定我想看哪個視頻流。
@flask.route("/video_feed")
def video_feed():
cam_id = request.args.get("cam_id")
if frame_to_stream.get(int(cam_id)) == None:
print (f"Camera-ID={cam_id} not Connected")
return f"Camera-ID={cam_id} not Connected"
return Response( gen_function(int(cam_id)), mimetype = "multipart/x-mixed-replace; boundary=jpgboundary" )
#Open in browser: localhost:5000/video_feed?cam_id=1
用於流的生成器函數是:
def gen(cam_id):
header = "--jpgboundary\r\nContent-Type: image/jpeg\r\n"
prefix = ""
while True:
frame = frame_to_stream[cam_id]
frame = analyze_and_modify_frame( frame )
msg = (prefix + header + "Content-Length: {}\r\n\r\n".format(len(frame)) )
yield (msg.encode("utf-8") + frame)
prefix = "\r\n"
time.sleep(1/30)
沒有顯着不同,但您可以使用itertools.count
作為新密鑰的來源。
from itertools import count
counter = count()
def add_to_dic(dic, element):
if element not in dic.values():
dic[next(counter)] = element
對於count
的實例, next
本質上等同於counter++
:您獲得掛起的值,並將下一個較大的值設置為下一個掛起的值。 由於您沒有分配給counter
,您還可以刪除global
語句。
默認情況下,序列從 0 開始。您可以將不同的起始值(例如 1)作為參數傳遞給count
。
如評論中所述,這等效於使用列表,如果您可以使用從 0 開始的鍵並且刪除項目不應該在鍵序列中留下間隙。
d = []
def add_to_dic(dic, element):
if element not in dic:
d.append(element)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.