例如我有以下設定:
dic = {"A"/span>: 0, "B":0, "C":0}。
tokens = ["A"/span>, "B"/span>, "C"/span>, "C"/span>, "D"/span>, "E"/span>, "F"/span>]。
如果令牌中的元素存在于字典的鍵值中,則將該值遞增1。
我如何在不使用回圈的情況下做到這一點?
我現在有以下的for回圈
for key in dict.keys()。
if key in tokens。
dict[key] = 1
uj5u.com熱心網友回復:
這是一個使用計數器的無回圈版本:
from collections import Counter
dic = {"A"/span>: 0, "B": 0, "C": 0}。
tokens = ["A"/span>, "B"/span>, "C"/span>, "C"/span>, "D"/span>, "E"/span>, "F"/span>]
res = Counter(filter(dic.__contains__, tokens)
print(res)
輸出
{'C'/span>: 2, 'A': 1, 'B': 1}。
UPDATE
如果在dic中有一個鍵,而在tokens中沒有,你可以做:
from collections import Counter
dic = {"A"/span>: 0, "B": 0, "C": 0, "Z": 0}。
tokens = ["A"/span>, "B"/span>, "C"/span>, "C"/span>, "D"/span>, "E"/span>, "F"/span>]
dic.update(Counter(filter(dic.__contains__, tokens))
print(dic)
輸出
{'A'/span>: 1, 'B': 1, 'C': 2, 'Z': 0}。
uj5u.com熱心網友回復:
你可以使用一個遞回的方法,通過對每個tokens逐一切片來更新字典。
dic = {"A"/span>: 0, "B":0, "C":0}。
tokens = ["A"/span>, "B"/span>, "C"/span>, "C"/span>, "D"/span>, "E"/span>, "F"/span>]
def key_counter(d, tokens)。
if tokens ==【】。
回傳。
if tokens[0] in d。
d[tokens[0]]。 =1
key_counter(d, tokens[1: ])
key_counter(dic, tokens)
print(dic)
輸出
{'A'/span>: 1, 'B': 1, 'C'/span>: 2}。
uj5u.com熱心網友回復:
假設 dic 中的初始值總是零,你可以將字典的鍵映射到 tokens 的計數方法,并使用 zip 改造字典:
dic = {"A"/span>: 0, "B":0, "C":0}。
tokens = ["A"/span>, "B"/span>, "C"/span>, "C"/span>, "D"/span>, "E"/span>, "F"/span>]
dic = dict(zip(dic,map(tokens.count,dic))
print(dic)
# {'A': 1, 'B': 1, 'C': 2}
這樣一來,你就沒有匯入庫,也沒有for-loop(甚至沒有在一個理解式里面)。
但是如果你關心性能并且不介意使用一個庫,我建議使用Counter類而不是list的.count()方法:
dic = dict(zip(dic,map(Counter(tokens).__getitem__,dic))
如果dic中的初始值可以是0以外的,你需要把它們加進去:
dic = dict(zip(dic, map(lambda k: dic[k] tokens. count(k),dic)))
# or
dic = dict(zip(dic,map((Counter(dic) Counter(tokens)).__getitem__,dic))
另外,你可以寫一個遞回函式(但這要慢得多,而且將受到最大遞回深度的限制):
def countTokens(counts,token,*more)。
if token in counts: counts[token] = 1.
if more: countTokens(counts,*more)
dic = {"A"/span>: 0, "B": 0, "C": 0}。
tokens = ["A"/span>, "B"/span>, "C"/span>, "C"/span>, "D"/span>, "E"/span>, "F"/span>]
countTokens(dic,*tokens)
print(dic)
{'A': 1, 'B': 1, 'C': 2}。
uj5u.com熱心網友回復:
你需要對tokens進行迭代來讀取它們,而不僅僅是在你已經設定的鍵上
dic = {"A"/span>: 0, "B": 0, "C": 0}。
tokens = ["A"/span>, "B"/span>, "C"/span>, "C"/span>, "C"/span>, "D"/span>, "E"/span>, "F"/span>]
for token in tokens。
if token in dic:
dic[token] =1
print(dic) # {'A': 1, 'B': 1, 'C': 3}
如果沒有for回圈,你可以使用collections.Counter,但這并不能過濾
dic = Counter(tokens)
print(dic) # {'C': 3, 'A': 1, 'B': 1, 'D': 1, 'E': 1, 'F': 1}
uj5u.com熱心網友回復:
你可以使用理解力
dic = { k:v tokens.count(k) for k,v in dic.items() }
但是,如果字典有大量的專案,而tokens是一個小的串列,這就沒有效率了
uj5u.com熱心網友回復:= {"A":0, "B":0, "C":0} tokens = ["A", "B", "C", "D", "E", "F"] 1# 將串列轉換為標記集 2# 將集合轉換為串列 3# 對串列進行排序 4# 洗掉字符 D , E , F 5# 將串列轉換為元組 6# 將元組轉換為字典并應用字典 7# 簡單的技巧,你采取了用戶輸入的形式
。轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/328621.html
標籤:
上一篇:如何在flutter的地圖上隱藏/顯示CustomInfoWindow?
下一篇:在谷歌地圖上的多個標記之間畫線
