例如:
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#用户输入的简单技巧