计算dict中get方法返回第二个选项的次数

时间:2017-06-05 10:56:42

标签: python python-3.x dictionary

我正在尝试根据字典的值构建一个列表,并使用get方法来处理缺少的值:

dic = {'foo': 1, 'bar': 2}
list_values = [dic.get(k, 0) for k in ['foo', 'bar', 'baz']]
print(list_values)
>>> [1, 2, 0]

问题是我想知道get方法返回第二个选项的次数。

我知道我可以使用一个简单的循环:

list_values = []
missing = 0
for k in ['foo', 'bar', 'baz']:
     if k in dic:
         list_values.append(dic[k])
     else:
         missing += 1
         list_values.append(0)

但与事先创建的列表理解相比,它似乎并不是真正的pythonic。

另一个想法是创建一个函数,然后使用包装器来计算调用函数的次数,但调用该函数是否存在使用get调用的密钥,正如这个简单的例子所示:

dic = {'a': 1}


# Do something to count the number of times the function was called
def missing_value():
    print('eh')
    return 0

print(dic.get('a', missing_value()))
>>> eh
>>> 1

任何人都有一个简单而优雅的解决方案,还是我应该决定在理解词典之外使用循环?

4 个答案:

答案 0 :(得分:1)

这应该可以解决问题:

sum( 1 for k in dic.keys() if k not in ['foo', 'bar', 'baz'])

避免使用获取来检查密钥是否存在

注意:您还可以使用以下集合的长度:

L = set(dic.keys())
L2 = set(['foo', 'bar', 'baz'])
print(len(L2) - len(L & L2))

答案 1 :(得分:0)

from collections import defaultdict
cnt = 0
def count_missing():
    global cnt
    cnt += 1
    return 0
d = defaultdict(count_missing)
d['foo'] = 1
d['bar'] = 2
list_values = [d[k] for k in ['foo', 'bar', 'baz']]
print(cnt)

答案 2 :(得分:0)

这将给出所需的答案:

sum(1 for k in [dic.get(k, 0) for k in ['foo', 'bar', 'baz']] if k == 0)

这是另一种方式:

ks = ['foo', 'bar', 'bad']

sum(1 for i in filter(lambda x: type(x) != int, [dic.get(k) for k in ks]))

答案 3 :(得分:0)

我可以在没有使用get()的情况下提出最好的一个:

dic = {'foo': 1, 'bar': 2}
search_keys = ['foo', 'bar', 'baz']
missing_keys = [x for x in search_keys if x not in dic.keys()]
print(missing_keys) # prints: ['baz']
print(len(missing_keys)) # prints only the number of missing keys (1)

它具有可读性的优势......