如何仅根据字典值在特定范围内打印字典的键值?

时间:2019-06-27 14:51:24

标签: python python-3.x dictionary dictionary-comprehension

假设我有以下格式的字典。

new_dict = {'worry': [23, 667, 1692, 1940], 'win': [96, 200, 286], 'work': [833, 1458]}

我只想基于0到100之间的值仅打印key键。

在这种情况下的输出:

  

{'worry','win'}

我尝试过:

dict0100 = {k:v for (k,v) in new_dict.items() if new_dict.values(range(100))}

我遇到错误,例如值仅接受1个参数。

注意:在我的情况下,值的范围在0到5000之间。我只想要0到100之间的键值。

感谢您的帮助。

5 个答案:

答案 0 :(得分:2)

尝试一下:

dict0100 = {k: v for (k, v) in new_dict.items() if any(i <= 100 for i in v)}

如果您也希望过滤列表:

dict0100 = {k: l for k, l in [(k, [i for i in v if i <= 100]) for k, v in new_dict.items()] if l}

有关<range的注意事项

关于使用比较运算符<in range()表达式,我会个人使用x < 100,因为这里所有列表项都被称为正整数,并且比较是表现更好:

import timeit

t1 = timeit.timeit(lambda: 3 in range(100))
print(t1) # 0.37976

t2 = timeit.timeit(lambda: 3 <= 100)
print(t2) # 0.08725

答案 1 :(得分:2)

我将对$firebase = (new Firebase\Factory) ->withServiceAccount($serviceAccount) ->create(); $storage = $firebase->getStorage(); $bucket = $storage->getBucket(); $base64Img = $base64Img->encoded; // your base64 encoded string $base64Img = str_replace('data:image/jpeg;base64,', '', $base64Img); $base64Img = str_replace(' ', '+', $base64Img); $object = $bucket->upload(base64_decode($base64Img), [ 'name' => $imageName ]); 使用范围检查。这是一个简洁的可重用生成器函数:

any

值得一提的是python-3.x中的membership checks on range objects are constant time (O(1))(但是python-2.x中的O(N),因此您可能希望使用纯比较来考虑其他解决方案)。

请注意,该范围是在正确的时间间隔内关闭的,这意味着如果您希望上限为包容性的,则需要执行def get_keys_in_range(dct, lo=0, hi=100): rng = range(lo, hi) for key, lst in dct.items(): if any(l in rng for l in lst): yield key [*get_keys_in_range(new_dict, lo=0, hi=100)] # ['worry', 'win']


可以缩短为

range(lo, hi+1)

您可以预缓存lo, hi = 0, 100 [key for key, lst in new_dict.items() if any(l in range(lo, hi) for l in lst)] # ['worry', 'win'] 以获得更高的性能(如在函数内部所做的那样)。

range

答案 2 :(得分:1)

尝试一下:

dict0100 = {k:v for (k,v) in new_dict.items() if [x for x in v if all([x<100,x>0])]}

这将同时保存键和值,因为键仅删除“:v”

答案 3 :(得分:1)

您的字典具有java.net.ConnectException: Connection refused: no further information类型的键和str类型的值

您的预期输出是一个list (of ints)对象(而不是set)。

尝试一下:

dict

这很好的事实是new_dict = {'worry': [23, 667, 1692, 1940], 'win': [96, 200, 286], 'work': [833, 1458]} set0100 = {k for k, arr in new_dict.items() if any(v in range(100) for v in arr)} print(set0100) 对象实现了range方法,该方法使我们可以在它们上使用__contains__

答案 4 :(得分:0)

dict0100 = {k:v for (k,v) in new_dict.items() if all([v_e < 5000 for v_e in v])}