获取元组索引字典的元素,仅指定元组的一个字段

时间:2013-10-20 22:25:38

标签: python list

我有一个由元组索引的字典形式的大(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'获取元素而不是遍历整个字典?我想在结果子列表上执行递归最小二乘拟合。

1 个答案:

答案 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')