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

Python 获取元组索引字典的元素,该字典只指定元组的一个字段,python,list,Python,List,我有一个大的(20k+)数据集,以元组索引的字典的形式,例如 a = {(1,'000200','l1p'): 53, (15,'230512','l3c'): 81, ...} a[(_,_,'l1p')]`, or `a[(:,:,'l1p')] 我想筛选只提供该元组的一个字段的字典,例如 a = {(1,'000200','l1p'): 53, (15,'230512','l3c'): 81, ...} a[(_,_,'l1p')]`, or `a[(:,:,'l1p')] 有没有

我有一个大的(20k+)数据集,以元组索引的字典的形式,例如

a = {(1,'000200','l1p'): 53, (15,'230512','l3c'): 81, ...}
a[(_,_,'l1p')]`, or `a[(:,:,'l1p')]
我想筛选只提供该元组的一个字段的字典,例如

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、1、2、…,等等的值的序列,而字典是一组无序的值,每个值都用唯一键(在本例中,元组)标记和访问

这样一来,要获得键的第三个元素为
'l1p'
a的所有值,只需执行以下操作:

[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'}
请注意,这不是一个内存友好的选项。使用生成器最接近的模拟是创建一个
(键、值)
对的生成器,而不是一个合适的字典:

((k,v) for k,v in a.items() if k[2] == 'l1p')

如何使用新列表?它看起来更像一个字典而不是一个列表。元组中只有一个字段的键是否仍然是唯一的?请参阅多键字典对这个问题的答案:dansalmo:我将对新列表执行一些算术运算。在筛选阶段删除任何元组字段后,条目将不唯一,即元组中提供的所有三个字段都是标识值所必需的。应用“l1p”过滤器后,我不再需要对值进行排序。我只需要带'l1p'键的值。DSM:是的,我的错。关于问题中的元组:编辑的时间有点晚了,我明白了,太晚了,对不起。谢谢你的回答,我没想到会有副字典。但是,在过滤之后,我不需要一个有序的列表。正如我在问题注释中提到的,我只需要满足“l1p”过滤器的值。因此,我的问题是:你能以迭代整个字典的方式获得这些元素吗?@SebastianKramer:不,你不能。