0

我有一大组(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”的元素吗?我想对结果子列表执行递归最小二乘拟合。

4

1 回答 1

2

首先,您拥有的是字典,而不是列表(绝对不是元组)。列表和元组只是编号为 0、1、2、... 等的值的序列,而字典是一组无序的值,每个值都用唯一的键标记和访问(在本例中为元组)。

顺便说一句,要获取akey 的第三个元素所在的所有值'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')
于 2013-10-20T22:40:49.210 回答