Skip to main content
 首页 » 编程设计

python之索引计数字典的嵌套列表

2025年05月04日17lonelyxmas

我是 Python 3 的新手,我正在使用产生嵌套概率列表的 Keras 乙状结肠激活。

我有一个看起来像这样的嵌套列表:

[[0.1, 0.2, 0.3, 0.2, 0.4, 0.5] 
 [0.2, 0.3, 0.3, 0.3, 0.2, 0.1] 
 ... 
 [0.1, 0.1, 0.4, 0.5, 0.1, 0.2]] 

我想做的是将这个列表转换成一个索引字典,其中每个索引键都有一个相应的频率计数,表示它在列表中满足特定条件的次数。

例如,给定上面示例嵌套列表中的三行并给定条件:

element > 0.2 

它将构建以下字典:

[ 
    0: 0 
    1: 1 
    2: 3 
    3: 2 
    4: 1 
    5: 1 
] 

这是因为在三个嵌套列表中,索引 0 处的值永远不会大于 0.2,索引 1 处的值仅一次大于 0.2(在第二个嵌套列表中),索引 2 处的值大于0.2 对于所有嵌套列表,对于两个嵌套列表(即第二和第三嵌套列表),索引 3 处的值大于 0.2,依此类推。

非常感谢!

请您参考如下方法:

将 a 作为相同长度列表的列表,我们可以将其转换为数组,从而得到一个 2D 数组。然后,与 2 进行比较,然后对每一列的 True 匹配项求和作为计数。最后从中设置输出字典。

因此,一种实现方式是 -

C = (np.asarray(a)>0.2).sum(axis=0) 
dict_out = {i:c for i,c in enumerate(C)} 

np.count_nonzero 也可以用在 np.sum 中,用于对匹配项求和。

sample 运行-

In [209]: a 
Out[209]:  
[[0.1, 0.2, 0.3, 0.2, 0.4, 0.5], 
 [0.2, 0.3, 0.3, 0.3, 0.2, 0.1], 
 [0.1, 0.1, 0.4, 0.5, 0.1, 0.2]] 
 
In [210]: C = (np.asarray(a)>0.2).sum(axis=0) 
 
In [211]: C 
Out[211]: array([0, 1, 3, 2, 1, 1]) 
 
In [212]: {i:c for i,c in enumerate(C)} 
Out[212]: {0: 0, 1: 1, 2: 3, 3: 2, 4: 1, 5: 1} 

处理参差不齐的子列表

对于参差不齐的子列表(输入列表中具有不同长度的列表),我们可以在用无效说明符(NaN 在这里似乎合适)填充值后将其转换为常规数组,然后沿适当的轴求和。因此,为了处理这种情况,修改后的实现将是 -

from itertools import izip_longest # For Python3, use zip_longest 
 
C = (np.array(list(izip_longest(*a, fillvalue=np.nan)))>0.2).sum(1) 
dict_out = {i:c for i,c in enumerate(C)} 

sample 运行-

In [253]: a 
Out[253]:  
[[0.1, 0.2, 0.3, 0.2, 0.4, 0.5, 0.7, 0.2], 
 [0.2, 0.3, 0.3, 0.3, 0.2, 0.1], 
 [0.1, 0.1, 0.4, 0.5, 0.1, 0.2, 0.1]] 
 
In [254]: C = (np.array(list(izip_longest(*a, fillvalue=np.nan)))>0.2).sum(1) 
 
In [255]: {i:c for i,c in enumerate(C)} 
Out[255]: {0: 0, 1: 1, 2: 3, 3: 2, 4: 1, 5: 1, 6: 1, 7: 0}