我有一个由元组索引的字典形式的大(20k +)数据集,例如
a = {(1,'000200','l1p'): 53, (15,'230512','l3c'): 81, ...}
我想过滤那个只提供该元组的一个字段的字典,例如
a[(_,_,'l1p')]`, or `a[(:,:,'l1p')]
有没有比创建列表更好的方法,比如
[i for i in a.keys() if 'l1p' in i]
正如我所说,我正在努力避免复制元素,因为字典中有很多条目。
编辑:有没有其他方法可以在键元组中使用'l1p'获取元素而不是遍历整个字典?我想在结果子列表上执行递归最小二乘拟合。答案 0 :(得分:2)
首先,你所拥有的是一本字典,而不是一个列表(肯定不是一个元组)。列表和元组只是编号为0,1,2,...等的值的序列,而字典是无序的值集,每个值都标记为&使用唯一键访问(在本例中为元组)。
有了这个,为了得到a
的所有值,其中第三个元素是'l1p'
,你可以这样做:
[v for k,v in a.items() if k[2] == 'l1p']
如果您担心保存内存并且不会尝试一次评估整个结果,可以将其重写为生成器表达式:
(v for k,v in a.items() if k[2] == 'l1p')
请注意,如果您使用的是Python 2,则需要将a.items()
更改为a.iteritems()
,否则对生成器的更改将无效。
或者,如果您想要获取包含匹配键的子词典,请执行以下操作:
{k: v for k,v in a.items() if k[2] == 'l1p'}
请注意,这不是一个内存友好的选项。使用生成器的最接近的模拟是创建(key, value)
对的生成器而不是正确的字典:
((k,v) for k,v in a.items() if k[2] == 'l1p')