python-3.x 提取(子)词典

x6492ojm  于 2022-12-24  发布在  Python
关注(0)|答案(1)|浏览(158)

我想从一个由一系列键组成的现有字典中提取一个子字典,这些键的值都是shape(N,3)或(N)的numpy数组,该子字典应该包含相同的键,这些键的值将是shape(m,3)或(m)的数组,m〈N,其中m个值是通过对键:值对中的一个应用某种标准获得的。
下面是一个非常简单的Python代码来举例说明我的问题。

import sys
import numpy as np

t1 = np.arange(0,30,0.5)
t1n = t1.reshape(20,3)

t2 = np.random.rand(20,1)

dtest = dict(p1=t1n, p2=t2)

ind_ok = np.where(dtest['p2'][dtest['p2'] > 0.7])
sub_dtest = dict(p1=dtest['p1'][ind_ok,:], p2=dtest['p2'][ind_ok,:])

这是一个只有两个对的简单字典,我从第二个对中提取行,验证一些条件,例如值大于0.7。然后我通过直接索引每个键:值对来构造所需的子字典(sub_dtest)。当我的字典中有很多对时,我必须为每个对重复赋值:Python中有没有更优雅方法来完成这项任务?
上面的代码是我所做工作的简化版本。

5f0d552i

5f0d552i1#

基于您所关心的固定关键点集使用a dictionary comprehension(简称dictcomp):

sub_dtest = {k: dtest[k][ind_ok,:] for k in ('p1', 'p2')}

或者使用原始dict

sub_dtest = {k: arr[ind_ok,:] for k, arr in dtest.items()}

第一个选项需要列出所有你关心的键,第二个选项是穷举的,尽管你可以添加一个条件来排除一些键,例如,如果你想要除了'pbad''pworse'之外的所有键,你可以将其更改为:

sub_dtest = {k: arr[ind_ok,:] for k, arr in dtest.items() if k not in {'pbad', 'pworse'}}

根据需要扩展被排除项的set(或者如果只想排除单个项,则缩减为if k != 'pbad')。

相关问题