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

时间:2017-03-30 08:27:32

标签: python list dictionary assign

设置

我有以下组列表,

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

其中每个组包含子组

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

最后,我有一本字典data

<小时/> 的意图

我想检查是否例如子组An位于lofl,如果是,我想将其字符串名称'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

<小时/> 的问题

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

1 个答案:

答案 0 :(得分:2)

避免使用所有指向相同类型数据的长变量名称列表。改为使用字典:

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)线性时间)和/或索引(比如将subgroups列表中的值映射到字符串的字典属于,所以你要做的就是使用index.get(x, 'unknown')而不是循环。