如何在字典中增加值而不使用循环?



例如:

dic = {"A":0, "B":0, "C":0} 
tokens = ["A", "B", "C", "C", "D", "E", "F"] 

如果令牌中的元素存在于字典键中,则将值加1。

如何在不使用循环的情况下做到这一点?我现在有以下for循环

for key in dict.keys(): 
if key in tokens: 
dict[key] += 1 

您可以使用递归方法逐个切片每个标记来更新字典。

dic = {"A":0, "B":0, "C":0} 
tokens = ["A", "B", "C", "C", "D", "E", "F"] 
def key_counter(d, tokens):
if tokens == []:
return
if tokens[0] in d:
d[tokens[0]] += 1
key_counter(d, tokens[1:])
key_counter(dic, tokens)
print(dic)

输出
{'A': 1, 'B': 1, 'C': 2}

这是一个使用Counter:

无循环版本
from collections import Counter
dic = {"A": 0, "B": 0, "C": 0}
tokens = ["A", "B", "C", "C", "D", "E", "F"]
res = Counter(filter(dic.__contains__, tokens))
print(res)

{'C': 2, 'A': 1, 'B': 1}

如果dic中有一个键,而tokens中没有,你可以这样做:

from collections import Counter
dic = {"A": 0, "B": 0, "C": 0, "Z": 0}
tokens = ["A", "B", "C", "C", "D", "E", "F"]
dic.update(Counter(filter(dic.__contains__, tokens)))
print(dic)

{'A': 1, 'B': 1, 'C': 2, 'Z': 0}

假设dic中的初始值始终为零,您可以将字典键映射到令牌的计数方法,并使用zip:

修改字典:
dic = {"A":0, "B":0, "C":0} 
tokens = ["A", "B", "C", "C", "D", "E", "F"]
dic = dict(zip(dic,map(tokens.count,dic)))
print(dic)
# {'A': 1, 'B': 1, 'C': 2}

这样,您就没有import库和for循环(甚至在推导式中也没有)。

但是如果你关心性能并且不介意使用库,我建议使用Counter类而不是列表的.count()方法:

dic = dict(zip(dic,map(Counter(tokens).__getitem__,dic)))

如果dic中的初始值可以不为零,则需要将它们添加到:

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": 0, "B": 0, "C": 0}
tokens = ["A", "B", "C", "C", "D", "E", "F"]
countTokens(dic,*tokens)
print(dic)
{'A': 1, 'B': 1, 'C': 2}

您需要在tokens上迭代以读取所有键,而不仅仅是您已经设置的键

dic = {"A": 0, "B": 0, "C": 0}
tokens = ["A", "B", "C", "C", "C", "D", "E", "F"]
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}

可以使用推导式

dic = { k:v+tokens.count(k) for k,v in dic.items() }

,但是如果字典有大量的条目,而令牌是一个小列表,那么这是低效的

={"A" 0,"B": 0,"C": 0}令牌=["A","B","C","C","D","E","F"】1#转换列表设置令牌2#将集合转换为列表3#排序列表删除字符D, E, F将列表转换为元组6#将元组转换为字典并应用字典7#用户输入的简单技巧

最新更新