字典:如果列表中有字符串,则将列表名称分配给字典

Dictionary: assign name of list to dictionary if string in list

设置

我有以下组列表列表,

lofl=[A,B,...,N]

其中每个组包含子组,

A=['A1','A2','A3',...,An]
B=['B1','B2','B3',...,Bn]
# ⋮           ⋮
N=['N1','N2','N3',...,Nn]

终于,我有了一本字典data


意向

我想检查是否子组 Anlofl 中,如果是这样,我想将其字符串名称 'A' 分配给 data['group'] 并将 An 分配给 data['subgroup'] .

注意:在我的实际数据集中,A,B,...,NAn,Bn,...,Nn都是没有数字的名字。


当前代码

if x in lofl:
   if x in A:
      data['group']='A'
      data['subgroup']=x
   elif x in B:
      data['group']='B'
      data['subgroup']=x
   #     ⋮
   elif x in N:
      data['group']='N'
      data['subgroup']=x
   else:
      data['group']='unknown'
      data['subgroup']=x


问题

代码有点长。此外,我想在组名不同的不同数据集上重用代码。我想避免必须为每个数据集替换代码中的名称。有什么建议吗?

避免使用一长串指向同一类型数据的变量名。改用字典:

subgroups = {
    'A': ['A1','A2','A3',...,An]
    'B': ['B1','B2','B3',...,Bn],
    # ⋮           ⋮
    'N': ['N1','N2','N3',...,Nn],
}

现在您可以用循环替换单独的 if..elif..else 树:

if x in lofl:
    data['subgroup'] = x
    for name, subgroup in subgroups.items():
        if x in subgroup:
            data['group'] = name
            break
    else:
        data['group'] = 'unknown'

您可能要考虑创建索引;遍历所有这些列表并测试每个列表是 昂贵的 (例如,每个 in 测试必须遍历整个列表)。考虑使用集合而不是列表(测试集合成员资格需要 O(1) 常数时间而不是 O(N) 线性时间) and/or 一个索引(就像字典将 subgroups 列表中的值映射到它们所属的键,所以你所要做的就是使用 index.get(x, 'unknown') 而不是循环)。