如何根据字典值只打印一定范围内的字典键值?
How to print only the key values of a dictionary for a certain range based on the dictionary values?
假设我有以下格式的字典。
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 之间的键值。
感谢任何帮助。
试试这个:
dict0100 = {k:v for (k,v) in new_dict.items() if [x for x in v if all([x<100,x>0])]}
这将同时保存键和值,对于键只删除“:v”
试试这个:
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
我会使用 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']
您可以 pre-cache range
获得更多性能(在函数内部完成)。
rng = range(lo, hi)
[key for key, lst in new_dict.items() if any(l in rng for l in lst)]
# ['worry', 'win']
你的字典有 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__
方法,这允许我们对它们使用 in
。
dict0100 = {k:v for (k,v) in new_dict.items() if all([v_e < 5000 for v_e in v])}
假设我有以下格式的字典。
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 之间的键值。
感谢任何帮助。
试试这个:
dict0100 = {k:v for (k,v) in new_dict.items() if [x for x in v if all([x<100,x>0])]}
这将同时保存键和值,对于键只删除“:v”
试试这个:
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
我会使用 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 中的
请注意,范围在正确的区间内关闭,这意味着如果您希望上限包含在内,您需要执行 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']
您可以 pre-cache range
获得更多性能(在函数内部完成)。
rng = range(lo, hi)
[key for key, lst in new_dict.items() if any(l in rng for l in lst)]
# ['worry', 'win']
你的字典有 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__
方法,这允许我们对它们使用 in
。
dict0100 = {k:v for (k,v) in new_dict.items() if all([v_e < 5000 for v_e in v])}