我正在尝试根据字典的值构建一个列表,并使用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
任何人都有一个简单而优雅的解决方案,还是我应该决定在理解词典之外使用循环?
答案 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)
它具有可读性的优势......