按关键字筛选字典



输入

dict = {
"samp1": "x",
"samp2": "x",
"exp1": "x"
}
ex = dict((k, v) for k, v in dict.items() if k in samp+str(range(1,10)))

预期输出

ex = {
"samp1":"x",
"samp2":"x"
}

我的代码在这一行str(range(1,10))中出错。

怎么能像这个if k in samp1 samp2 samp3...samp10一样呢?

为了指出代码中的错误,我试图修改min。试试这个(使用f-string和dict理解的(:

dict={
"samp1":"x",
"samp2":"x",
"exp1":"x"
}
li = [F"samp{i}" for i in range(1,11)]
ex = {k:v for k, v in dict.items() if k in li}
print(ex)

输出:

{'samp1': 'x', 'samp2': 'x'}

另一个(感谢@OlvinRoght的isDecimal。(:

dict = {
"samp1":"x",
"samp2":"x",
"samp12":"x",
"samp":"x",
"sampxyz":"x",
"exp1":"x"
}
ex = {k:v for k, v in dict.items() if k.startswith("samp") and k[4:].isdecimal() and (0 < int(k[4:]) <= 10) }
print(ex)

输出:

{'samp1': 'x', 'samp2': 'x'}

试试下面的方法:

ex = {}
for obj in dict:
if obj.startswith('samp'):
ex[obj] = dict[obj]
print(ex)

我建议在这里使用re.match来检查key是否以指定的模式开始:

import re
{k:v for k, v in d.items() if re.match(r'^samp[0-9]', k)}
# {'samp1': 'x', 'samp2': 'x'}

或者,您可以使用startswith,它也可以采用tuple:

m = tuple(['samp'+str(i) for i in range(10)],)
{k:v for k, v in d.items() if k.startswith(m)}
# {'samp1': 'x', 'samp2': 'x'}

使用filter和regexp:

import re
idict = { 
"samp1": "x",
"samp2": "x",
"exp1": "x" 
}
MATCH = re.compile(r'samp[1-9]')
odict = dict(filter(lambda kv: MATCH.fullmatch(kv[0]), idict.items()))
print(odict)

更新:如果密钥的数量总是像问题中那样少,那么只检索这几个密钥可能会更有效(当然,如果存在的话(。类似于:

mykeys = ["samp1", ..., "samp9"]
odict = {key: idict[key] for key in mykeys if key in idict}

最新更新