设置
我有以下组列表,
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,...,N
和An,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
<小时/> 的问题
代码有点长。此外,我想在不同的数据集上重用代码,组名称不同。我想避免必须替换每个数据集的代码中的名称。有什么建议吗?
答案 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')
而不是循环。