【python小操作】黃金搭檔:list和set
今天也是遇到一點工作中的小問題,克服了這個困難之後,讓我對list和set有了更深入的瞭解~
關於list和set的特性,可以看我往期的文章:pyhon中的資料型別
背景:
在DEEP_SORT_YOLOv3中,在檢測行人的時候,除了可以記錄行人的座標,還可以記錄行人的臨時ID,見下圖:

我要做的工作就是在每一幀中把行人的id抓出來,然後放在他的座標資訊的後面,同時把所有的id都放在一個列表裡,但是列表裡的id每個只能出現一次,如:
[1,2,3,4,5,6,7,8,9,…,234]
最後需要生成的樣式為紅框中的形式:

基於每個id只能出現一次的特性,我自然而然想到用set來實現。首先把所有幀的所有id都append到一個list裡,再把這個list變成set,那每個id都只有一個啦~~哈哈,萬事大吉,然而事情並沒有那麼簡單,一顆老鼠屎壞了一鍋湯的破事兒又發生了,由於我是遍歷這個set中的元素,一個一個加再一個一個加逗號的,於是最後會多一個逗號~~我比較笨拙,還是用檢查這個元素是不是最後一個要新增的元素的方法來解決,如果是,那就不加逗號,如果不是,那就加逗號,表達得有些亂,還是直接看程式碼吧:
以下程式碼對應上面的截圖的最後一行文字寫入~
input_tags_set =set(track_id) #track_id為儲存了所有id的陣列(存在重複id)
tmp ='"framerate":"1","inputTags":"'
f.write(tmp)
len_input_tags = len(input_tags_set)#獲取陣列長度
for i in range(len_input_tags):
if i == len_input_tags-1:如果當前元素是最後一個元素,就只寫入元素
tmp = str(input_tags_set [i])
f.write(tmp)
else:#如果當前元素不是最後一個元素,寫入元素加逗號
tmp = str(input_tags_set [i])+','
f.write(tmp)
tmp ='","suggestiontype":"track","scd":false,"visitedFrames":[],"tag_colors":["#c1ee0c"]}'
f.write(tmp)
大家看上面的程式碼觀察到什麼問題了麼?

我一開始沒意識到,set是不能用索引訪問的,也就是說input_tags_set[i]這樣的寫法是錯的,當時程式就直接報錯:

因為list可以用索引訪問,所以我就想著索性再把set變回list,不就又可以用索引訪問了麼?哈哈我真是太機智了~~
於是現在這段程式碼變成這樣了:
input_tags_set =set(track_id) #obtain ids once for all
#把list變成set消除重複值,再把set變回list,用索引訪問
input_tags_list= list(input_tags_set)
tmp = '"framerate":"1","inputTags":"'
f.write(tmp)
len_input_tags = len(input_tags_list)
for i in range(len_input_tags):
if i == len_input_tags-1:
tmp = str(input_tags_list[i])
f.write(tmp)
else:
tmp = str(input_tags_list[i])+','
f.write(tmp)
tmp ='","suggestiontype":"track","scd":false,"visitedFrames":[],"tag_colors":["#c1ee0c"]}'
f.write(tmp)
歡迎關注“pyhon修煉之道”,我們將持續更新新鮮python相關文章~
