Python 如何基于字典值仅打印特定范围内字典的键值?

Python 如何基于字典值仅打印特定范围内字典的键值?,python,python-3.x,dictionary,dictionary-comprehension,Python,Python 3.x,Dictionary,Dictionary Comprehension,假设我有一本以下格式的词典 new_dict={'concern':[2366716921940],'win':[96200286],'work':[8331458]} 我只想打印键仅基于0到100之间的值的键 这种情况下的输出: {‘担心’、‘赢’} 我试过: dict0100 = {k:v for (k,v) in new_dict.items() if new_dict.values(range(100))} 我得到的错误类似于值只接受1个参数 注意:在我的例子中,值的范围在0到500

假设我有一本以下格式的词典

new_dict={'concern':[2366716921940],'win':[96200286],'work':[8331458]}
我只想打印
仅基于0到100之间的值的键

这种情况下的输出:

{‘担心’、‘赢’}

我试过:

dict0100 = {k:v for (k,v) in new_dict.items() if new_dict.values(range(100))}
我得到的错误类似于值只接受1个参数

注意:在我的例子中,值的范围在0到5000之间。我只想要0到100之间的键值

感谢您的帮助

试试这个:

dict0100 = {k:v for (k,v) in new_dict.items() if [x for x in v if all([x<100,x>0])]}
dict0100 = {k: v for (k, v) in new_dict.items() if any(i <= 100 for i in v)}
dict0100={k:v表示新目录项中的(k,v)如果[x表示v中的x如果所有([x0])}的话
这将同时保存键和值,对于仅键,请删除“:v”

尝试以下操作:

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

我会对
any
使用范围检查。下面是一个简洁的可重用生成器函数:

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']

值得一提的是,在Python 3.x中(但是在Python 2.x中O(n),所以你可能想用纯的比较来考虑其他的解决方案)。 请注意,范围在正确的间隔上是闭合的,这意味着如果希望上界包含在内,则需要执行

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']
您可以预缓存
范围
,以获得更高的性能(如函数内部所做的)


您的dict具有类型为
str
的键和类型为
list(of int)

您的预期输出是一个
集合
对象(而不是
目录

试试这个:

new_dict={'concern':[2366716921940],'win':[96200286],'work':[8331458]}
set0100={k代表k,arr在新的目录项()中(如果有)(v在范围(100)中代表v在arr中)}
打印(set0100)

这使用了一个很好的事实,即
range
对象实现了
\uuuuu contains\uuuu
方法,它允许我们在
中对它们使用

dict0100={k:v for(k,v)in new dict.items(),如果所有([v_e<5000 for v in v])
v in range(100)
是不必要的贪婪,由于
v range objects
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
函数实际上非常有效。。。它使用一个简单的算术运算。从“保持简单”的角度来看,我看不出在这里使用
range
的好处。。。它可以是O(1),更贪婪的是一个简单的
值被称为介于0和5000之间“比较更有效”当然,性能很重要,但这是一个不必要的微优化,牺牲了一定程度的可读性。我不想麻烦。好吧,但我不能100%同意
x<100
的可读性不如
范围内的()。。。不管怎样,这里的范围很好。@Chris_Rands yay刚刚在你发布的帖子中添加了免责声明:从“保持简单”的角度来看,我看不到在这里使用
range
的好处。。。它可以是O(1),它比简单的
@olinox14更贪婪,它只是一个选项,而且我比在python3上使用
if
更简洁,因为在python3上使用它是有意义的(因为它是一个常量时间操作)<代码>范围内的数字(低,高)
也非常可读。我也不知道你说的“贪婪”是什么意思。“据说列表只包含正整数”似乎是一个非序列。关于列表,我只是引用了OP:
在我的例子中,值的范围在0到5000之间。
。贪婪,我的意思是,即使它是一个常数时间操作,它也比简单的比较更耗时,你不同意吗?@olinox14我看不出值的范围在这里有多重要。我同意范围更费时,但除非子列表非常大,几乎没有机会为大多数子列表找到积极的方面,否则差异不是我真正关心的。请添加上下文,以便将来的读者能够理解为什么这样做。
rng = range(lo, hi)
[key for key, lst in new_dict.items() if any(l in rng for l in lst)]
# ['worry', 'win']