簡體   English   中英

使用新元素更新字典時,是否有使用計數器作為鍵的pythonic方法?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM